Моя тема, кажется, не была создана ... есть идеи, почему? - PullRequest
0 голосов
/ 09 апреля 2009

В моем приложении для Windows у меня есть usercontrol, который, в свою очередь, содержит несколько других пользовательских контролов.

Непосредственно перед окончанием конструктора основного пользовательского элемента управления я пытаюсь создать поток ... но он не создается:

mainUserControl()
{
   var t=new Thread(ThreadJob);
   t.IsBackground=true;
   t.Start();
}


private void ThreadJob() 
{
   //Thread.Sleep(120000);
   //if(txtStatus.InvokeRequired) {
   //  txtStatus.Invoke(new MethodInvoker(delegate { txtStatus.Text="Thread started"; }));
   //}

   txtStatus.Text="sample";
 }

Этот код не работает: я принимаю это как доказательство того, что поток не создается, как если бы тогда txtStatus.Text="sample"; вызвал бы исключение .... верно?

Так что здесь происходит? Почему не создается моя тема?

Ответы [ 5 ]

3 голосов
/ 09 апреля 2009

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

Использовать точку останова и отладчик ...

1 голос
/ 09 апреля 2009

Полагаю, поскольку вы удалили задержку, поток будет порождаться, устанавливать значение и завершать работу.

Доступ к txtStatus.Text из неправильного потока, тем не менее, не гарантирует выброс. Существуют ситуации, когда вы можете получить доступ к свойству элемента управления из фонового потока, и оно не будет выброшено. (Вы все равно не должны этого делать!)

Если вы все еще считаете, что поток не запускается, вы можете попытаться установить там точку останова - я вполне уверен, что вы увидите, что она достигает этой точки.

1 голос
/ 09 апреля 2009

Фоновые потоки обычно не имеют доступа к компонентам, созданным в пользовательском интерфейсе. Я предлагаю добавить пробную уловку в ThreadJob, но лучше всего вместо этого использовать BackgroundWorker , поскольку это было разработано для прямого доступа к компонентам потока пользовательского интерфейса (ну, с помощью невидимой магии: -)

0 голосов
/ 09 апреля 2009

Вы не должны использовать объект ThreadStart?

Как в:

Thread t = new Thread(new ThreadStart(ThreadJob));

Я использую объекты ThreadStart и ParamatizedThreadStart без проблем все время. Вам определенно не следует обращаться к объектам пользовательского интерфейса, созданным в другом потоке, если только вы не отключили это исключение, его следует выбросить, как вы правильно сказали, если ваш вышеуказанный поток работает должным образом.

David

0 голосов
/ 09 апреля 2009

То, что исключение потока в Forms не было выброшено, является не хорошим доказательством того, что ваш поток не выполнялся. Немного лучший способ проверить, работает ли ваш поток: замените назначение на Console.Out.WriteLine("sample"), а затем проверьте вывод консоли.

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