c # ошибка в потоке с UserControls - PullRequest
1 голос
/ 26 августа 2010

Вот моя ситуация:

Я создал экземпляр ac # usercontrol в главном потоке, но он не добавлен в форму.

//global declaration
usercontrol1 datacontrol;

 constructor()
{
.......
     datacontrol = new usercontrol1();
........
}

У меня есть асинхронный фоновый поток, который запускает событие, которое обрабатывается созданным экземпляром управления данными.В обработчике событий есть:

if(InvokeRequired){BeginInvoke(..);}

. Это должно предотвратить любые перекрестные вызовы.Однако когда это вызывается, InvokeRequired имеет значение false, поэтому обработчик не вызывается в правильном потоке.Поэтому в обработчике, когда я пытался this.labelname.text = "blah", выдается исключение между потоками.

Однако, если я добавляю элемент управления на панель в основной форме и удаляю его, то разрешаюфоновый поток для запуска события.Обработчик входит, но на этот раз для InvokeRequired задано значение true, поэтому он правильно вызывает себя в контексте mainthreads, избегая исключения.

Может кто-нибудь объяснить мне, почему действие по добавлению его в панель и удалению его устраняетОшибка?

Для формы нет событий onLoad, поэтому все должно быть правильно создано без прорисовки.

спасибо!Stephanie

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

Вероятно, это связано с тем, что дескриптор элемента управления еще не создан. Если вы ссылаетесь на dataform.Handle в своем конструкторе, он должен создать дескриптор и установить соответствующий идентификатор потока, поэтому InvokeRequired вернет true позже.

Вы также можете принудительно создать дескриптор с помощью CreateControl , но только если элемент управления видим.

1 голос
/ 26 августа 2010

Когда вы добавляете элемент управления (или форму) к родителю, он устанавливает Создание WindowHandles.Очевидно, это также необходимо для инициализации контекста выполнения для логики InvokeRequired.

Итак, не думайте, что созданный, но никогда не показанный элемент управления или форма ведет себя «нормально».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...