【求助】如何在UI界面中等待另一个线程结束后再继续执行下面的程序,UI界面不能挂死
需求如下:
有一个Form类:UI(主线程)
一个Thread类:ThreadA
现在要求在UI中调用ThreadA,等A调用完成后接着执行UI下面的代码部分,同时这个时候UI界面不能够挂死
读了各种关于委托和INVOKE的内容,大多数是讲怎么跨线程设置控件,我这个感觉相对简单的实现在网上怎么搜也搜不到=。=
试过ThreadA.join(),这个会让界面挂死,不行的
其实线程A的目的就是复制几个文件,如果能做到复制的时候不让界面挂死,不用线程也罢。不过最主要的还是想掌握这种方法
求各位大神支招Orz
[解决办法]
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace PMS.CommonLib
{
public delegate void DoHandler();
public class ComReadTimeout
{
private ManualResetEvent mTimeoutObject;
//标记变量
private bool mBoTimeout;
public DoHandler Do;
public ComReadTimeout()
{
// 初始状态为 停止
this.mTimeoutObject = new ManualResetEvent(true);
}
///<summary>
/// 指定超时时间 异步执行某个方法
///</summary>
///<returns>执行 是否超时</returns>
public bool DoWithTimeout(TimeSpan timeSpan)
{
if (this.Do == null)
{
return false;
}
this.mTimeoutObject.Reset();
this.mBoTimeout = false; //标记
this.Do.BeginInvoke(DoAsyncCallBack, null);
// 等待 信号Set
if (!this.mTimeoutObject.WaitOne(timeSpan, false))
{
this.mBoTimeout = false;
}
return !this.mBoTimeout;
}
///<summary>
/// 异步委托 回调函数
///</summary>
///<param name="result"></param>
private void DoAsyncCallBack(IAsyncResult result)
{
try
{
this.Do.EndInvoke(result);
// 指示方法的执行未超时
this.mBoTimeout = true;
}
catch (Exception ex)
{
this.mBoTimeout = false;
}
finally
{
this.mTimeoutObject.Set();
}
}
}
}