我的线程似乎没有被创建......任何想法为什么?

时间:2009-04-08 21:45:09

标签: c# multithreading

在我的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 个答案:

答案 0 :(得分:3)

它不一定会引发异常。它可能有,但是它可能再次失败了。这是为什么不鼓励跨线程UI访问的原因:它是片状和危险的。总的来说,验证程序的好方法不是按照你认为应该的方式设置的。

使用断点和调试器......

答案 1 :(得分:1)

后台线程通常无法访问UI线程创建的组件。我的建议是给ThreadJob添加一个try catch,但最重要的是使用BackgroundWorker代替,因为它被设计为直接访问UI线程组件(好吧,使用看不见的魔法: - )

答案 2 :(得分:1)

我的猜测是,自从你拿出延迟后,线程就会产生,设置值并关闭。

但是不能保证从错误的线程访问txtStatus.Text。在某些情况下,您可以从后台线程访问控件上的属性,但不会抛出。 (但你仍然不应该这样做!)

如果您仍然认为线程没有启动,您可以尝试在那里设置一个断点 - 我相当肯定您会看到它正在达到这一点。

答案 3 :(得分:0)

没有抛出Forms线程异常是你的线程没有运行的好证据。验证线程运行的更好方法:用Console.Out.WriteLine("sample")替换赋值,然后检查控制台输出。

答案 4 :(得分:-1)

你不应该使用ThreadStart对象吗?

如:

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

我一直使用ThreadStart和ParamatizedThreadStart对象而没有问题。你绝对不应该访问在另一个线程中创建的UI对象,除非你已经禁用了这个异常,否则应该抛出它,正如你正确说明的那样,如果你的上面的线程正在按预期工作。

大卫