WINFORM应用,如何实现等待子线程结束的同时,主界面UI不卡,请高手出招,在线等..............

问题描述

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都不错
其他方案:
线程泛滥不好用,,优化线程!

时间: 2024-07-28 17:56:56

WINFORM应用,如何实现等待子线程结束的同时,主界面UI不卡,请高手出招,在线等..............的相关文章

windows主线程如何等待子线程结束

问题描述 windows主线程如何等待子线程结束 我在主线程中起了多个子线程,想等所有子线程结束主线程再继续做后面的事情. 但是我自起子线程的函数下面用WaitForMultipleObjects等待所有子线程结束,会阻塞主线程导致程序无反应死掉. 请各位大侠帮忙看下应该如何处理? 解决方案 WaitForMultipleObjects 确实会阻塞主线程的,不想阻塞主线程就只能自己实现,使用事件或者其它类似的机制. 系统没有现成的,只能自己使用线程间通讯的机制来实现. 解决方案二: MsgWai

JAVA进阶----主线程等待子线程各种方案比较(转)

创建线程以及管理线程池基本理解 参考原文链接:http://www.oschina.net/question/12_11255?sort=time  一.创建一个简单的java线程 在 Java 语言中,一个最简单的线程如下代码所示:  Java代码   Runnable runnable = new Runnable(){      public void run(){         System.out.println("Run");      }   }   可通过下面一行代码

主线程等待子线程运行结束再完成的效果如何实现

问题描述 主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的).这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的.应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示:2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个

main-java 子线程结束结束 内部子线程也结束 具体看代码注释

问题描述 java 子线程结束结束 内部子线程也结束 具体看代码注释 import java.util.ArrayList; import org.junit.Test; /** 代码很简单的 就是起了一个线程 然后在一个list里面放了1000个数字 然后打印以下 但是test方法 用junit起的 不能完全打印 而main可以 最终是想要使得这个test方法能和main的效果一样 * */ public class TestSub { @Test public void test() { /

c++中如何将子线程的参数传回主线程

问题描述 c++中如何将子线程的参数传回主线程 1C DWORD WINAPI threadFunction(LPVOID pArg) //返回值进程id(dword类型) 参数类型 LPVOID{ tNum myNum = *((tNum *)pArg); //将参数转化成int型 EnterCriticalSection(&gCS); // 进入临界区 myNum.string_back = FuzzyHash(myNum.string_in); LeaveCriticalSection(&a

ios-怎么在一个线程结束后回到主线程?

问题描述 怎么在一个线程结束后回到主线程? 我用一个for循环上传三张照片(用的是afnetworking框架). 上传它就开了一个线程,上传成功后后台返回一个filename,把filename放进一个数组 我想等三张照片全都上传结束后,对获取到的三个filename进行操作 要怎么做? NSMutableArray *fileNameArr = [[NSMutableArray alloc]init]; for (int i= 0; i<[self.imgArr count]; i++) {

线程中的回调函数如何获得返回值,请高手开悟,在线等......

问题描述 普通回调方法:classA{classBxx=newclassB();stringss=k.ca(tm);stringtm(stringxm){returnxm+"一杯醉倒";}}classB{publicdelegatestringtc();publicstringca(tcmm){MessageBox.Show("到这里了!");returnmm("我");}}执行stringss=k.ca(tm);语句后,得到回调函数tm的返回值

GLOBAL 另起线程使用Application的时候遇到了问题,请高手帮忙解决一下

问题描述 global代码是这样的usingProject.Bll.Account.SystemSend;protectedvoidApplication_Start(objectsender,EventArgse){SystemSendSystemSend=newSystemSend();ThreadThd1=newThread(newThreadStart(SystemSend.Call_Get_MessSend));Thd1.Start();}SystemSend类代码publicvoid

Android中Activity销毁而绘制UI的子线程未销毁的解决方法

如果我们开发一个需要播放音频的应用,我们都知道播放音频要用到MediaPlayer类,我这里,不需要开启Service,就在本Activity播放音频,当Activity销毁的时候,音频便结束 但是有一个重点,需要即时的变化当前播放的时间 我的思路是,开启一个线程,计算当前音频的剩余播放时间,如果>0 则用Handler循环发送一个消息来更改时间UI Thread tPlay ; tPlay = new Thread(new Runnable() {     @Override     publ