TASK线程问题请教

问题描述

我的需求是,用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执行后续代码,而不是用主线程去等待

时间: 2024-09-20 12:37:59

TASK线程问题请教的相关文章

c#-C#线程问题请教大师解决

问题描述 C#线程问题请教大师解决 一共有2个线程 1大堆数据 现在制定A线程5分钟内获取数据处理数据 A线程执行任务 如果完成 sleep,如果未完成 ,把剩余的工作给B线程 B线程5分钟时限 如果完成 slep 如果未完成 放弃任务. 我不知道怎么做了! 大师们能分析下吗 怎么处理 谢谢 解决方案 完成后为什么要Sleep?线程任务完成后就自动退出了. 解决方案二: 用BackGroundWorker操作性多些

线程中止-请教一个JAVA线程的奇怪问题

问题描述 请教一个JAVA线程的奇怪问题 在学习JAVA线程时候的遇到一个很奇怪的现象.让我们先来看代码 public class TestThread { public static void main(String[] args) { IRun ir = new IRun(); Thread it = new Thread(ir); it.start(); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger

Flink运行时之TaskManager执行Task

TaskManager执行任务 当一个任务被JobManager部署到TaskManager之后,它将会被执行.本篇我们将分析任务的执行细节. submitTask方法分析 一个任务实例被部署所产生的实际影响就是JobManager会将一个TaskDeploymentDescriptor对象封装在SubmitTask消息中发送给TaskManager.而处理该消息的入口方法是submitTask方法,它是TaskManager接收任务部署并启动任务执行的入口方法,值得我们关注一下它的实现细节.

请教多线程操作同一个数据表时,怎么避免表死锁

问题描述 最近有一个数据采集的项目,要求可以多路并发,遇到多线程操作同一个数据表的问题,经常发生表死锁,求各位大侠帮忙,大约有20-40个进程实例化读取类,类中Receive方法接收数据并存储上代码publicclassclsTranslateObj{privatevoidReceive(){intlenReceive=0;byte[]receivedByte=newbyte[BUFFER_SIZE];//接收返回字节数组_rtnStr=string.Empty;while(_flgConnec

Spark源码分析之八:Task运行(二)

        在<Spark源码分析之七:Task运行(一)>一文中,我们详细叙述了Task运行的整体流程,最终Task被传输到Executor上,启动一个对应的TaskRunner线程,并且在线程池中被调度执行.继而,我们对TaskRunner的run()方法进行了详细的分析,总结出了其内Task执行的三个主要步骤:         Step1:Task及其运行时需要的辅助对象构造,主要包括:                        1.当前线程设置上下文类加载器:        

Asp.Net异步编程知识

写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到各种打着Asp.Net异步编程的口号,如何提高性能,如何提高吞吐率! 好多文章都说得不清楚,甚至是错误的.只看到了一些表现,混淆概念.希望这篇文章能够能够对一部分人理解Asp.net异步编程模型. 1基础知识,谈一个初学者不容易理解的基础知识,这个基础知识,很不基础的哦 先看这个代码 ThreadPool.GetMaxTh

为了不在直播中看到少儿不宜的景象,阿里做了这些

       直播作为近来新兴的互动形态和今年阿里巴巴双十一的一大亮点,其内容风险监控是一个全新的课题,技术的挑战非常大,管控难点主要包括业界缺乏成熟方案和标准.主播行为.直播内容不可控.峰值期间数千路高并发处理.对算法的高实时响应要求等等. 阿里巴巴集团安全部今年在直播管控中的特色在于大量采用人工智能和深度学习等技术,配合优化后的高性能多媒体计算集群,大幅度降低人工审核成本的同时,提升了对内容风险的防控能力.系统在峰值期间成功处理5400路直播视频,以及共计25万场粉丝连连看游戏,对违规内容进

ftp-Ftp服务器可以使用多线程吗?

问题描述 Ftp服务器可以使用多线程吗? 我们知道ftp服务器可以使用多进程,那么多线程可以吗?会不会因为多个线程使用同一个账号登陆,对目录的操作会影响其他线程?请教各位,谢谢啦. 解决方案 当然可以.ftp本身没有会话机制,但是它基于连接,互相之间没有影响.当然需要服务器的支持,但是主流的ftp服务器端都支持. 解决方案二: 肯定是可以的,找一个ftp服务器端安装上即可,记得打开端口. 解决方案三: FTP的话是可以的,而且因为基于链接,所以是没哟影响的 解决方案四: 当然可以了,至于说读写文

java.util.concurrent解析——ThreadPoolExecutor源码解析

任何一种语言.框架,线程都是非常重要的一部分.要想实现异步就需要通过异步线程,但是频繁地创建销毁线程会带来较大的性能开销,而线程池就是为解决这一问题而出现的.简单来说线程池有以下几大优势: 降低资源开销:通过复用已经创建的线程,降低线程频繁创建.销毁带来的资源开销和性能损耗 快速启动任务:通过复用已有线程,快速启动任务 易于管理:线程池可以统一管理.分配.调优和监控 Java中的线程池是基于ThreadPoolExecutor实现的,我们使用的ExecutorService的各种线程池策略都是基