#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/…