Control.Invoke выполняет указанный делегат в потоке, которому принадлежит дескриптор окна управления.Зачем нужен Control.Invoke?
В течение многих лет я только что принял, что так оно и должно быть, но я никогда не понимал, почему.
Единственное, что я могу придумать, это то, что код ужасно небезопасен, и вместо того, чтобы просто добавить небольшую синхронизацию в управляющий код, инфраструктура просто распустила его и заставила нас спуститься по этому маршруту - выбросив ребенка с помощью вода в ванной!
Это просто Microsoft лень, или есть что-то, что я просто не получаю?
У других программных фреймворков/других ОС есть схожие проблемы или это просто вещь Windows?
Есть ли способ обойти его, кроме как изменить каждую функцию в нашем приложении?
ОК, я понимаю, что не хочу иметь дополнительные служебные накладные расходы, но не будет ли это накладными расходами на инфраструктуру, чтобы вызвать Control.Invoke сам, а не поднимать «Неверная операция кросс-потоков: здесь имеет место имя элемента управления» поток, отличный от потока, который был создан на «исключении»? –
Calling Control.Invoke имеет определенные обязанности, которые структура не может просто предполагать, что приложение знает. Например, если вы не будете осторожны, вы можете создать тупиковые ситуации, и если бы инфраструктура просто сделала это для вас, это могло бы создать взаимоблокировки без вашего ведома. Вот хороший пример http://social.msdn.microsoft.com/forums/en-US/clr/thread/a35e5298-33c4-4461-b956-bf265484219e –
Хорошо, да, я это понимаю. Спасибо, это немного облегчает мою путаницу! –