加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C#主线程等待子线程运行结束

(2014-04-08 10:13:24)
标签:

子线程

等待

c-sharp

分类: 技术内容
    由于主程序中调用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还是会卡住。事实上,上述方法相当于是将主线程阻塞了,因此提示框卡住就难以避免。同时,我还发现,使用多线程后,得出结果的速度更快了,效率上有着一定的提高。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有