C#主线程等待子线程运行结束
2016-10-13 20:59
393 查看
佐左佑右 原文 C#主线程等待子线程运行结束
由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然后在主线程中弹出一个提示框,显示数据正在加载,等子线程运行结束后,主线程继续工作。
使用的是http://hi.baidu.com/oktell/item/5527f51d93abb4a5feded5a8中所提到的方法,用了这篇文章中的第一个方式,即不带参数的。
之后在其中加入了显示和关闭提示框的代码,最终完成。代码如下:
经过试用后发现,UI中的等待gif还是会卡住。事实上,上述方法相当于是将主线程阻塞了,因此提示框卡住就难以避免。同时,我还发现,使用多线程后,得出结果的速度更快了,效率上有着一定的提高。
由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然后在主线程中弹出一个提示框,显示数据正在加载,等子线程运行结束后,主线程继续工作。
使用的是http://hi.baidu.com/oktell/item/5527f51d93abb4a5feded5a8中所提到的方法,用了这篇文章中的第一个方式,即不带参数的。
之后在其中加入了显示和关闭提示框的代码,最终完成。代码如下:
using System.Threading; namespace ThreadStudy { class StopAllWaitBySubThread { List manualEvents = new List(); public void Main() { ManualResetEvent mre = new ManualResetEvent(false); manualEvents.Add(mre); ThreadPool.QueueUserWorkItem(ThreadMethod, mre); Form f = Application.OpenForms["Form_CreateObject"];//查找是否打开过窗体 if (f == null) //没打开过 ,打开 { Form_CreateObject datamanage = new Form_CreateObject(); datamanage.Show(); } else { f.Focus(); //打开过就让其获得焦点 } WaitHandle.WaitAll(manualEvents.ToArray());//程序会在此处暂停,等待子线程运行结束。 f = Application.OpenForms["Form_CreateObject"];//查找是否打开过窗体 if (f == null) //没打开过 { } else { f.Close(); //打开过就关掉 } } private void ThreadMethod(object obj) { //耗时的函数,处理事情,Matlab Matlab(); ManualResetEvent mre = (ManualResetEvent)obj; mre.Set(); Console.WriteLine("Thread execute"); } } }
经过试用后发现,UI中的等待gif还是会卡住。事实上,上述方法相当于是将主线程阻塞了,因此提示框卡住就难以避免。同时,我还发现,使用多线程后,得出结果的速度更快了,效率上有着一定的提高。
相关文章推荐
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
- CountDownLatch实现主线程等待所有子线程运行结束后再继续执行的实现
- C# 多线程join的用法,等待多个子线程结束后再执行主线程
- java中主线程等待所有子线程结束
- 多个子线程并发执行,主线程等待所有子线程都结束后再继续运行
- JAVA主线程等待子线程全部结束
- c# 子线程运行完通知主线程
- 多线程以及主线程等待并发子线程运行
- 并发问题和主线程等待所有子线程运行完毕再执行
- C# 等待Process结束再执行主线程
- 线程:Java主线程等待子线程结束
- C# 多线程的等待所有线程结束 用 ManualResetEvent 控制
- 解决c#所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。 转载
- 多个线程运行结束之后主线程再执行CountDownLatch
- 主线程等待子线程运行完之后再运行
- java中对线程的实现 等待多个子线程结束 多个子线程运行中进行同步
- 主线程中使用join等待所有子线程执行结束
- c#如何实现一个线程暂停,等待用户输入文本后继续运行?
- CLR 无法从 COM 上下文 0x1a2740 转换为 COM 上下文 0x1a28b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
- MASM32编程用两种方法运行外部程序并等待其结束