TASK线程问题请教

gooodiuck 2015-03-12 02:36:17
我的需求是,用TASK创建线程,运行一个函数funA。函数中读外设的值,将读过来的值,即时的赋给主窗体的控件。在主线程中,我需要等待tsk1线程运行结束后,再继续后面的代码。

问题在于:当我通过Task.WaitAll等待线程执行结束,程序会假死。删除Task.WaitAll(tsk1)后,设断点查看Tsk1的状态一直为“Running”。

请教各位解决办法。

private void button1_Click(object sender, EventArgs e)
{
Task tsk1 = Task.Factory.StartNew(() => funA());
Thread.Sleep(1000);
Task.WaitAll(tsk1);
等待,tsk1结束后,继续运行后面的代码。
}
private string funA()
{

……一些运算

this.Invoke(new Action(
() => { this.label1.Text = "结果1"; }));
……继续运算
this.Invoke(new Action(
() => { this.label2.Text = "结果2"; }));

……继续运算

}
...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
寂空冷 2015-03-12
  • 打赏
  • 举报
回复
用一个Task集合监测你的设备,然后用ContinueWith执行后续代码,而不是用主线程去等待
  • 打赏
  • 举报
回复
你应该用ContinueWith执行后续代码,而不是通过Wait
wanghui0380 2015-03-12
  • 打赏
  • 举报
回复
Task.start 就好 不要waitall
於黾 2015-03-12
  • 打赏
  • 举报
回复
再开个线程,去等待其他线程,而不要让主线程等
gooodiuck 2015-03-12
  • 打赏
  • 举报
回复
谢谢楼上二位指点,我程序有这样的需求,我需要实时监测多个外设,外设是个测试装置,用来测试产品的多项参数,并将测试数据实时发给PC,而PC需要立即将数据展现出来。在测试完成后,将数据统计,保存等等。 所以我想开多个线程,来监测外设,主线程等检测完成后,再处理所有数据。
於黾 2015-03-12
  • 打赏
  • 举报
回复
在主线程中,我需要等待tsk1线程运行结束后,再继续后面的代码 这就好比领导说:我要等员工工作完了,再继续自己的工作.然后就站在员工身后盯着他看 这样有什么意义? 你应该给线程注册回调函数,等线程执行完毕了,主线程执行这个回调函数(搜委托) 这就好比领导给员工分配完任务,自己该干嘛干嘛去,然后等员工干完了来汇报.而不是在那里干等
  • 打赏
  • 举报
回复
引用 楼主 gooodiuck 的回复:
我的需求是,用TASK创建线程,运行一个函数funA。函数中读外设的值,将读过来的值,即时的赋给主窗体的控件。在主线程中,我需要等待tsk1线程运行结束后,再继续后面的代码。 Task tsk1 = Task.Factory.StartNew(() => funA()); Thread.Sleep(1000); Task.WaitAll(tsk1); 等待,tsk1结束后,继续运行后面的代码。
线程不适合于你。 既然你在思想上就以为“主窗体应该要等待”,你还搞线程干什么呢?这种代码一看就知道,WaitAll 堵塞着(而且前边的Sleep根本毫无意义),那不是跟根本不用 Task 的程序一样嘛。 只要是你“一张口”就是“窗体等待.....”,那么这里去考虑时髦的“线程”就永远也不适合于你。线程的作用就在于并发执行,然后当完成之后,将结果在窗体上展现。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧