Есть ли последствия для размещения Application.Run() в потоке, отличном от исходного?

#c# #.net #multithreading #winforms #thread-safety

Вопрос:

В настоящее время я пробую свои силы в .NET generic host в сочетании с WinForms и экспериментирую с чем-то подобным:

 var mainmenu = new Thread(() => Application.Run(_mainMenuView as Form));
mainmenu.SetApartmentState(ApartmentState.STA);
mainmenu.Start();
 

с _mainMenuView, являющимся интерфейсом, реализованным формой MainMenuView, которую я получаю от DI yadayadayada.

Мои вопросы сейчас таковы:

  • Имеет ли это непредвиденные последствия?
  • Нужно ли мне присоединять поток обратно к моему «основному» потоку?
  • Умирает ли нить, если я просто закрою форму?
  • Насколько безопасно получать или устанавливать свойства через интерфейс? Нужно ли мне заботиться о вызове?

Спасибо за помощь

Комментарии:

1. Это то же самое, как если бы вы запустили его в основном потоке, а затем получили доступ к форме из другого потока. Так, например, все взаимодействия с пользовательским интерфейсом должны проходить через диспетчер (Вызов).

2. Я сделал это, чтобы показывать заставки во время запуска приложения без каких-либо проблем (делаю это уже более десяти лет, так что я, вероятно, уже заметил бы какие-либо проблемы!). Тем не менее, заставки делают не очень много и практически не взаимодействуют с пользователем, так что YMMV.

Ответ №1:

Я тоже переживал из-за этого. Вы можете запустить Application.Run его в другом потоке,

  • Нужно ли мне присоединять поток обратно к моему «основному» потоку?
  • Насколько безопасно получать или устанавливать свойства через интерфейс? Нужно ли мне заботиться о вызове?

Если вы хотите задать какие-либо свойства из потока, который не совпадает с приложением.run, выполняется. вы должны заботиться о блокировке.

  • Умирает ли нить, если я просто закрою форму?

Поток завершится, когда вы закроете форму.

  • Имеет ли это непредвиденные последствия?

Одна из проблем, с которой вы столкнетесь, Application заключается в том, что класс использует статические свойства/методы. Таким образом, вы можете получить странное поведение при попытке создать несколько потоков с помощью приложения.запустите его.

Комментарии:

1. Это весьма полезно. Не могли бы вы подробнее рассказать о блокировке? Я уже видел ключевое слово «блокировка» раньше, но еще не использовал его. Статичность приложения-это тоже то, что меня беспокоило, но я еще не видел ничего странного, у вас есть какие-то меры предосторожности, которые я должен принять?

2. Вот некоторая информация: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…