[英]How to estimate method execution time?
如果需要花費兩秒鍾以上的時間才能完成並在另一個線程上重新啟動它,我需要取消方法執行。
那么,有沒有辦法/回調機制/ HACK,我可以讓方法通知我它超過了2秒的時限?
在C#中檢查網絡驅動器是否存在超時
https://web.archive.org/web/20140222210133/http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution-time
異步模式:
public static T SafeLimex<T>(Func<T> F, int Timeout, out bool Completed)
{
var iar = F.BeginInvoke(null, new object());
if (iar.AsyncWaitHandle.WaitOne(Timeout))
{
Completed = true;
return F.EndInvoke(iar);
}
F.EndInvoke(iar); //not calling EndInvoke will result in a memory leak
Completed = false;
return default(T);
}
您應該在兩秒鍾內創建System.Threading.Timer,然后在另一個線程中運行您的方法,並等待其回調,如果在計時器運行之前方法已完成,則應處置計時器,否則應中止正在執行方法的線程。 例如,這很簡單
using (new Timer(BreakFunction, true, TimeSpan.FromMinutes(2), Timeout.Infinite))
{
//TODO:here you should create another thread that will run your method
}
在BreakFunction中,您應該中止運行您的方法的線程
如果能找到它,那將是很好。 我也一直在尋找它。
我通常要做的是在另一個Thread
啟動該方法,並在這種情況下用2秒啟動一個Timer
。 第一次引發事件時,只需執行以下操作:
if (a.IsAlive)
{
a.Abort();
}
兩件重要的事情:
Thread
應該由處理計時器的方法可見 Abort()
,它將引發ThreadAbortException ,因此您應該在方法中正確處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.