问题描述
WINFORM应用,如何实现等待子线程结束的同时,主界面UI不卡,请高手出招,在线等..............业务描述有以下耗时业务队列需要按顺序完成UI界面有按钮M,点击M,在处理函数YY中,需要执行以下任务队列{执行耗时业务A(提交给到线程)等待A完成处理结果执行耗时业务B(提交给到线程)等待B完成处理结果执行耗时业务c(提交给到线程)等待c完成处理结果...........}问题:在等待线程N结束的过程中,如何实现不卡UI?如果在函数YY中,直接使用ManualResetEvent可以卡在此处不往后执行下一个业务,但是UI卡死;如果不等待,所有业务同时进行,无法保证任务按队列的顺序执行(要求任务必须是A完成后,开始B,B完成后,开始C,以此类推)应用举例:业务ABCDEF.......为一个SQL语句队列,其中,B语句构造需要A语句结果,C语句构造需要B语句结果......使用异步回调无法回到调用函数中继续后面的业务(业务长度业是动态的,无法预先得知)
解决方案
解决方案二:
把所有那些乱七八糟的按顺序执行的函数,放到一个线程里去执行,不就得了在你的脑海里,要么不用线程,要么分6个线程,就不敢用1个线程?
解决方案三:
这问题就好比打扫卫生,必须先扫天棚,再擦窗户,再擦桌子,最后拖地,否则地擦干净了再擦天棚,地白擦了那按你之前的思路,要么你自己打扫,要么请4个人来分别打扫4个地方就不敢请一个人来按这个顺序打扫,然后把你自己解放出来?
解决方案四:
兄弟,这是业务抽象模型,假设有应用需要1000个这样的处理,需要写1000个不同的线程处理函数(禁用药物数量不同,其他都一样),如果能实现这样的处理(等待线程完成,且不卡UI),最多几个函数就行,你说那个合算?之所以提出这个需求,是因为在VCz中这样的需求能实现,但C#不支持消息传递(C#只能传递到窗口,不能传递到窗口的按钮事件中)
解决方案五:
兄弟,这是业务抽象模型,假设有应用需要1000个这样的处理,需要写1000个不同的线程处理函数(仅业务数量不同,其他都一样),如果能实现这样的处理(等待线程完成,且不卡UI),最多几个函数就行,你说那个合算?之所以提出这个需求,是因为在VC中这样的需求能实现,但C#不支持消息传递(C#只能传递到窗口,不能传递到窗口的按钮事件中)如果能实现VCDLL中发出一个消息WM_USER+999,在c#的按钮事件中能捕捉到这个消息,请告知,问题解决!!!或者能实现在按钮P(C#)中发出一个发出消息0x0400+999,在按钮M的处理函数yy中,能收到这个消息(不是窗体收到),也行
解决方案六:
找到你那个按钮的句柄,直接发消息,这样不可行吗?
解决方案七:
还有2楼的说法也没错啊,直接把业务a到n全放在一个线程里执行不就完了
解决方案八:
C#只能传递到窗口,不能传递到窗口的按钮事件中我是不知道你为什么要传递到窗口的按钮事件中从你上面的描述,根本没看出这样做有任何意义而且即使想传递事件,C#里可以自定义委托和事件啊
解决方案九:
至于什么1000个处理还是10000个处理的这跟多线程有任何关系?你都放到UI线程里让它阻塞运行,1000个处理如何组合,还是得自己写代码判断啊放到线程里,不是完全一样的逻辑吗
解决方案十:
先谢谢大家,我再想想,觉得有办法了
解决方案十一:
好好想想,我就不说你了。
解决方案十二:
“等待”有多种含义,不要太任性。一种好的等待方式,是注册它的回调。你不用打扰它,它会调用你的。
解决方案十三:
引用楼主edit89的回复:
使用异步回调无法回到调用函数中继续后面的业务(业务长度业是动态的,无法预先得知)
应该说你的先入为主的思路妨害了整个流程设计。所谓“主程序”一瞬间就执行完毕了,UI线程一瞬间就被释放回去了。除了第一步以外,所有业务都是在回调中继续的,包括在第一个回调中决定“第二个业务是什么”这也是在回调中执行的代码。如果你接受这种编程思路,那么你的基本的编程流程设计思路就打通了“另一半”。如果你满脑子只有一条顺序执行的线路,那么你得流程设计思路永远只有不足一半。
解决方案十四:
只有顺序执行流程思路的人,只能写点简单的“函数计算”程序。因为单线程顺序计算程序才是这样的。如果涉及到真实的(哪怕仅仅)涉及到另个独立运行的对象的程序,你要是死抱着函数式计算的顺序编程思路,都无法设计好程序。如果你要设计一个比较流畅的用户界面程序,就是事件驱动的。(这里的事件是广义的概念,不是单指.net的事件)你习惯于根据事件来驱动你的程序,才能设计出应用程序来。
解决方案十五:
用MQ阿,兄弟
其他方案:
UI界面只负责生成业务类的实体和把实体塞到MQ里的工作,具体业务的实行由MQ来做
其他方案:
UI这边根本就不用多线程,而且MQ的现成的产品很多,微软的MSMQ或者IBM的MQ都不错
其他方案:
线程泛滥不好用,,优化线程!