2009-12-29 5 views
1

Control.Invoke выполняет указанный делегат в потоке, которому принадлежит дескриптор окна управления.Зачем нужен Control.Invoke?

В течение многих лет я только что принял, что так оно и должно быть, но я никогда не понимал, почему.

Единственное, что я могу придумать, это то, что код ужасно небезопасен, и вместо того, чтобы просто добавить небольшую синхронизацию в управляющий код, инфраструктура просто распустила его и заставила нас спуститься по этому маршруту - выбросив ребенка с помощью вода в ванной!

  • Это просто Microsoft лень, или есть что-то, что я просто не получаю?

  • У других программных фреймворков/других ОС есть схожие проблемы или это просто вещь Windows?

  • Есть ли способ обойти его, кроме как изменить каждую функцию в нашем приложении?

ответ

5

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

Конечно, Microsoft могла бы поместить синхронизацию в инфраструктуру для предотвращения этой проблемы, но при этом было бы слишком много накладных расходов для приложений, которым не нужна эта функциональность (поскольку они в основном однопоточные).

Решение Microsoft состоит в том, чтобы заставить тех, кому нужны накладные расходы, управлять ими явно, а не принуждать их к каждому.

+0

ОК, я понимаю, что не хочу иметь дополнительные служебные накладные расходы, но не будет ли это накладными расходами на инфраструктуру, чтобы вызвать Control.Invoke сам, а не поднимать «Неверная операция кросс-потоков: здесь имеет место имя элемента управления» поток, отличный от потока, который был создан на «исключении»? –

+1

Calling Control.Invoke имеет определенные обязанности, которые структура не может просто предполагать, что приложение знает. Например, если вы не будете осторожны, вы можете создать тупиковые ситуации, и если бы инфраструктура просто сделала это для вас, это могло бы создать взаимоблокировки без вашего ведома. Вот хороший пример http://social.msdn.microsoft.com/forums/en-US/clr/thread/a35e5298-33c4-4461-b956-bf265484219e –

+0

Хорошо, да, я это понимаю. Спасибо, это немного облегчает мою путаницу! –

0

Там в углубленных review о сортировочной выполнения в потоке пользовательского интерфейса.