您的位置:首页 > 编程语言 > C#

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

2016-10-13 20:59 393 查看
佐左佑右 原文 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还是会卡住。事实上,上述方法相当于是将主线程阻塞了,因此提示框卡住就难以避免。同时,我还发现,使用多线程后,得出结果的速度更快了,效率上有着一定的提高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐