实现代码:
namespace ConsoleApplication4
{
public delegate void DoHandler();
public class TimeOut
{
private ManualResetEvent mTimeoutObject;
//标记变量
private bool mBoTimeout;
public DoHandler Do;
public TimeOut()
{
// 初始状态为 停止
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 = true; //标记
this.Do.BeginInvoke(DoAsyncCallBack, null);
// 等待 信号Set
if (!this.mTimeoutObject.WaitOne(timeSpan, false))
{
this.mBoTimeout = true;
}
return this.mBoTimeout;
}
///<summary>
/// 异步委托 回调函数
///</summary>
///<param name="result"></param>
private void DoAsyncCallBack(IAsyncResult result)
{
try
{
this.Do.EndInvoke(result);
// 指示方法的执行未超时
this.mBoTimeout = false;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
this.mBoTimeout = true;
}
finally
{
this.mTimeoutObject.Set();
}
}
}
}
测试代码:
namespace ConsoleApplication4
{
class Program
{
private static Stopwatch watch;
private static System.Threading.Timer timer;
[STAThread]
static void Main(string[] args)
{
watch = new Stopwatch();
TimeOut timeout = new TimeOut();
timeout.Do = new Program().DoSomething;
watch.Start();
timer = new System.Threading.Timer(timerCallBack, null, 0, 500);
Console.WriteLine("4秒超时开始执行");
bool bo = timeout.DoWithTimeout(new TimeSpan(0, 0, 0, 4));
Console.WriteLine(string.Format("4秒超时执行结果,是否超时:{0}", bo));
Console.WriteLine("***************************************************");
timeout = new TimeOut();
timeout.Do = new Program().DoSomething;
Console.WriteLine("6秒超时开始执行");
bo = timeout.DoWithTimeout(new TimeSpan(0, 0, 0, 6));
Console.WriteLine(string.Format("6秒超时执行结果,是否超时:{0}", bo));
timerCallBack(null);
watch.Stop();
timer.Dispose();
Console.ReadLine();
}
static void timerCallBack(object obj)
{
Console.WriteLine(string.Format("运行时间:{0}秒", watch.Elapsed.TotalSeconds.ToString("F2")));
}
public void DoSomething()
{
// 休眠 5秒
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 0, 5));
}
}
}
执行结果: