因为 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"); }
你把while(true)去掉还是不行,不是这个原因
textBox1.Invoke(fc);
Invoke执行的是主线程的函数,但是主线程被join阻塞了,所以为什么加上thread.join()后无法执行.
你通过异步执行UI线程,但是你JOIN的时候,UI线程就停止了,当然无法执行。 要不将信息返回,最后放到UI线程上,要不就不用JOIN,直接START().
1,while导致后台线程永不退出
2,死锁,
SetData占有执行权,却又调用UI线程里需要执行权的
ThreadFunction。
验证,去掉while(true),
用回调使用
ThreadFunction
异步不是这样用的,你这样用会死循环的, 看看这个博客 http://www.cnblogs.com/zhili/archive/2012/07/18/ThreadPool.html 希望可以对你有所启发