2011-02-17 132 views
3

我有要求取消方法執行,如果它需要超過兩秒鐘完成並在另一個線程上重新啓動它。如何估計方法執行時間?

那麼,有沒有什麼辦法/回調機制/ HACK,我可以讓方法告訴我它超過了2秒的時間限制?

+1

你爲什麼不啓動它從一開始另一個線程? – 2011-02-17 05:53:40

+0

我真的不認爲有任何簡單的方法*精確*做你的要求。你需要在整個地方插入鉤子。你爲什麼堅持首先在調用線程上調用該方法? – Ani 2011-02-17 06:10:03

回答

3

check if network drive exists with timeout in 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); 
    } 
2

您應該在兩秒鐘內創建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你應該中止運行你的方法

1

線程這將是很好的,如果你能找到它。我一直在尋找它。

我通常做的是在另一個Thread開始方法,並在這種情況下開始Timer 2秒。它會引發事件的第一次,只是做:

if (a.IsAlive) 
{ 
    a.Abort(); 
} 

兩個重要的事情:

  • 聲明應該由一個處理計時器
  • 當調用Abort()方法是可見的Thread,它提出ThreadAbortException,所以你應該在方法中正確處理它。