c#程序设定使用期限_C# 给某个方法设定执行超时时间
在某些情況下(例如通過網(wǎng)絡(luò)訪問數(shù)據(jù)),常常不希望程序卡住而占用太多時間以至于造成界面假死。
在這時、我們可以通過Thread、Thread + Invoke(UI)或者是 delegate.BeginInvoke 來避免界面假死,
但是這樣做時,某些代碼或者是某個方法的執(zhí)行超時的時間還是無法操控的。
那么我們又是否有一種比較通用的方法、來設(shè)定某一個方法的執(zhí)行超時的時間,讓其一旦超過指定時間則跳出指定方法、進(jìn)而繼續(xù)向下執(zhí)行呢?
答案當(dāng)然是肯定的。
delegate.BeginInvoke可以實現(xiàn)代碼代碼的異步執(zhí)行,在這種情況下,只要讓程序可以等待一個Timespan,如果在Timespan到達(dá)之前方法內(nèi)的代碼還沒有執(zhí)行完畢、說明該方法執(zhí)行超時了。
那么關(guān)鍵的就是“等待一個Timespan”,而恰好.NET 里提供了一些類和方法來實現(xiàn)該功能。我這里選用的是ManualResetEvent.WaitOne(timespan, false);其返回值代碼其是否在特定時間內(nèi)收到信號,而我們恰好可以利用這個布爾值 外加一個標(biāo)記變量 來判斷一個方法是否執(zhí)行超時。
相關(guān)的實現(xiàn)代碼如下:
public delegate voidDoHandler();public classTimeout
{privateManualResetEvent mTimeoutObject;//標(biāo)記變量
private boolmBoTimeout;publicDoHandler Do;publicTimeout()
{//初始狀態(tài)為 停止
this.mTimeoutObject = new ManualResetEvent(true);
}///
///指定超時時間 異步執(zhí)行某個方法///
///執(zhí)行 是否超時
public boolDoWithTimeout(TimeSpan timeSpan)
{if (this.Do == null)
{return false;
}this.mTimeoutObject.Reset();this.mBoTimeout = true; //標(biāo)記
this.Do.BeginInvoke(DoAsyncCallBack, null);//等待 信號Set
if (!this.mTimeoutObject.WaitOne(timeSpan, false))
{this.mBoTimeout = true;
}return this.mBoTimeout;
}///
///異步委托 回調(diào)函數(shù)///
///
private voidDoAsyncCallBack(IAsyncResult result)
{try{this.Do.EndInvoke(result);//指示方法的執(zhí)行未超時
this.mBoTimeout = false;
}catch(Exception ex)
{
Console.WriteLine(ex.Message);this.mBoTimeout = true;
}finally{this.mTimeoutObject.Set();
}
}
}
View Code
調(diào)用:
private staticStopwatch watch;private staticSystem.Threading.Timer timer;static void Main(string[] args)
{
watch= newStopwatch();
Timeout timeout= newTimeout();
timeout.Do= newProgram().DoSomething;
watch.Start();
timer= new System.Threading.Timer(timerCallBack, null, 0, 500);
Console.WriteLine("4秒超時開始執(zhí)行");bool bo = timeout.DoWithTimeout(new TimeSpan(0, 0, 0, 4));
Console.WriteLine(string.Format("4秒超時執(zhí)行結(jié)果,是否超時:{0}", bo));
Console.WriteLine("***************************************************");
timeout= newTimeout();
timeout.Do= newProgram().DoSomething;
Console.WriteLine("6秒超時開始執(zhí)行");
bo= timeout.DoWithTimeout(new TimeSpan(0, 0, 0, 6));
Console.WriteLine(string.Format("6秒超時執(zhí)行結(jié)果,是否超時:{0}", bo));
timerCallBack(null);
watch.Stop();
timer.Dispose();
Console.ReadLine();
}static void timerCallBack(objectobj)
{
Console.WriteLine(string.Format("運行時間:{0}秒", watch.Elapsed.TotalSeconds.ToString("F2")));
}public voidDoSomething()
{//休眠 5秒
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 0, 5));
}
View Code
地址:http://www.cnblogs.com/08shiyan/archive/2011/07/30/2122183.html
總結(jié)
以上是生活随笔為你收集整理的c#程序设定使用期限_C# 给某个方法设定执行超时时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结构光测距相位差_ROHM确立新型VCS
- 下一篇: nio的优势_NIO研究所 | 最有AI