zoukankan      html  css  js  c++  java
  • C#主线程等待子线程运行结束

    佐左佑右 原文 C#主线程等待子线程运行结束

      由于主程序中调用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还是会卡住。事实上,上述方法相当于是将主线程阻塞了,因此提示框卡住就难以避免。同时,我还发现,使用多线程后,得出结果的速度更快了,效率上有着一定的提高。
  • 相关阅读:
    分享点干货(此this非彼this)this的详细解读
    程序员需要掌握的排序算法之希尔排序(最小增量排序)
    JAVA基础学习笔记
    简单的时间日期格式化(未封装成控件)
    面试造航母,工作拧螺丝
    浅谈jquery插件开发模式
    Relative与Absolute组合使用
    表单
    个人介绍
    用计数法解决数组排序问题
  • 原文地址:https://www.cnblogs.com/arxive/p/5958123.html
Copyright © 2011-2022 走看看