问题描述
我的需求是,用TASK创建线程,运行一个函数funA。函数中读外设的值,将读过来的值,即时的赋给主窗体的控件。在主线程中,我需要等待tsk1线程运行结束后,再继续后面的代码。问题在于:当我通过Task.WaitAll等待线程执行结束,程序会假死。删除Task.WaitAll(tsk1)后,设断点查看Tsk1的状态一直为“Running”。请教各位解决办法。privatevoidbutton1_Click(objectsender,EventArgse){Tasktsk1=Task.Factory.StartNew(()=>funA());Thread.Sleep(1000);Task.WaitAll(tsk1);等待,tsk1结束后,继续运行后面的代码。}privatestringfunA(){……一些运算this.Invoke(newAction(()=>{this.label1.Text="结果1";}));……继续运算this.Invoke(newAction(()=>{this.label2.Text="结果2";}));……继续运算}
解决方案
解决方案二:
引用楼主gooodiuck的回复:
我的需求是,用TASK创建线程,运行一个函数funA。函数中读外设的值,将读过来的值,即时的赋给主窗体的控件。在主线程中,我需要等待tsk1线程运行结束后,再继续后面的代码。Tasktsk1=Task.Factory.StartNew(()=>funA());Thread.Sleep(1000);Task.WaitAll(tsk1);等待,tsk1结束后,继续运行后面的代码。
线程不适合于你。既然你在思想上就以为“主窗体应该要等待”,你还搞线程干什么呢?这种代码一看就知道,WaitAll堵塞着(而且前边的Sleep根本毫无意义),那不是跟根本不用Task的程序一样嘛。只要是你“一张口”就是“窗体等待.....”,那么这里去考虑时髦的“线程”就永远也不适合于你。线程的作用就在于并发执行,然后当完成之后,将结果在窗体上展现。
解决方案三:
在主线程中,我需要等待tsk1线程运行结束后,再继续后面的代码这就好比领导说:我要等员工工作完了,再继续自己的工作.然后就站在员工身后盯着他看这样有什么意义?你应该给线程注册回调函数,等线程执行完毕了,主线程执行这个回调函数(搜委托)这就好比领导给员工分配完任务,自己该干嘛干嘛去,然后等员工干完了来汇报.而不是在那里干等
解决方案四:
谢谢楼上二位指点,我程序有这样的需求,我需要实时监测多个外设,外设是个测试装置,用来测试产品的多项参数,并将测试数据实时发给PC,而PC需要立即将数据展现出来。在测试完成后,将数据统计,保存等等。所以我想开多个线程,来监测外设,主线程等检测完成后,再处理所有数据。
解决方案五:
再开个线程,去等待其他线程,而不要让主线程等
解决方案六:
Task.start就好不要waitall
解决方案七:
你应该用ContinueWith执行后续代码,而不是通过Wait
解决方案八:
用一个Task集合监测你的设备,然后用ContinueWith执行后续代码,而不是用主线程去等待