首页 新闻 会员 周边 捐助

多线程问题。高手进

0
悬赏园豆:5 [已解决问题] 解决于 2012-09-04 22:35

为什么加上thread.join()

后无法执行。

彬彬@科比的主页 彬彬@科比 | 初学一级 | 园豆:43
提问于:2012-07-21 11:48
< >
分享
最佳答案
0

因为 SetData 无限循环了, thread 永远不会结束, 加上join 之后 UI线程会一直等待 thread的结束。  你应该在 SetData 中加入break,或者 return 来跳出循环

-----

更正, 应该使用beginInvoke

 

public void SetData()
        {
            while (true)
            {
                Thread.Sleep(1000);
                ThreadFunction();

                return;
            }
        }

        private void ThreadFunction()
        {
            Action fc = () => textBox1.Text = DateTime.Now.ToString();
            if (textBox1.InvokeRequired)
            {
                textBox1.BeginInvoke(fc);
            }
            else
            {
                fc();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(SetData);
            thread.IsBackground = true;
            thread.Start();
            thread.Join();
            MessageBox.Show("xieshaobin");
        }
收获园豆:5
gunsmoke | 老鸟四级 |园豆:3592 | 2012-07-21 12:38

你把while(true)去掉还是不行,不是这个原因

彬彬@科比 | 园豆:43 (初学一级) | 2012-07-21 12:45
其他回答(4)
0

textBox1.Invoke(fc);

Invoke执行的是主线程的函数,但是主线程被join阻塞了,所以为什么加上thread.join()后无法执行.

Tom.汤 | 园豆:3058 (老鸟四级) | 2012-07-21 12:48
0

你通过异步执行UI线程,但是你JOIN的时候,UI线程就停止了,当然无法执行。 要不将信息返回,最后放到UI线程上,要不就不用JOIN,直接START().

you know what it is | 园豆:241 (菜鸟二级) | 2012-07-21 17:02
0

1,while导致后台线程永不退出

2,死锁,

SetData占有执行权,却又调用UI线程里需要执行权的
ThreadFunction。
验证,去掉while(true),
用回调使用
ThreadFunction
arg | 园豆:1047 (小虾三级) | 2012-07-24 17:44
0

异步不是这样用的,你这样用会死循环的, 看看这个博客 http://www.cnblogs.com/zhili/archive/2012/07/18/ThreadPool.html 希望可以对你有所启发

Learning hard | 园豆:362 (菜鸟二级) | 2012-07-25 23:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册