2009-09-23 63 views
2

我有一個問題,很多人都很熟悉:我正在進行一個調用(具體是Forest.GetCurrentForest()),在某些情況下,它將無法工作並拋出異常。不是一個大問題,只要抓住它並妥善處理即可。然而,當它失敗時,呼叫非常緩慢;完成完成需要30秒。我可以編寫一個通用的方法來調用超時的其他方法嗎?

我去尋找一種方法來調用該方法,但設置了一個超時時間,以便我們可以在更短的時間後停止。我發現了一個有趣的建議here,但是如果我能解決問題,我想要一個更通用的解決方案。這個解決方案對於超時而言也很重要。我希望這會很容易,比如說

CallMethodWithTimeout(Delegate method, int timeout) 

但是我不確定這樣的事會發生什麼。任何關於做這樣的事情的建議,還是在C#中是不可能的?我們也堅持使用.NET 2.0。除非這樣,否則我將對保持GetCurrentForest()調用花費30秒的時間來確定它沒有發生的評論。雖然我想知道這種通用方法調用方法的可行性。

+0

不管你做什麼,請不要使用'Thread.Abort'或'Thread.Interrupt'。 :) – Joren 2009-09-23 21:27:04

+0

會做。或者不......對。 ;) 謝謝大家的回覆。我想我們現在可能已經解決了這個問題,但我很高興在未來出現一些事情時提出這些建議。 – CodexArcanum 2009-09-30 16:07:19

回答

2

我給它一點思想並用以下方法上來(基本上是一個什麼樣邁克爾,而我是編碼它寫了一個實現):

private static bool TimedMethodCaller(Delegate dlgt, int timeout, 
    params object[] args) 
{ 
    ManualResetEvent waitHandle = new ManualResetEvent(false); 
    Thread t = new Thread(new ThreadStart(delegate 
     { 
      dlgt.Method.Invoke(dlgt.Target, args); 
      waitHandle.Set(); 
     })); 
    t.Start(); 
    return waitHandle.WaitOne(timeout); 
} 

使用這種方法,你可以在任何發佈代表和您感覺的參數。它的缺點是不能處理返回值(但也可能以某種方式實現)。

你可以把它像這樣:

// parameter-less method call 
bool success = TimedMethodCaller(new Action(ParamlessTestMethod), 100); 

如果你想調用了參數的方法,你需要一個合適的委託:

// call with one parameter (using the Action<T> delegate of the framework 
bool success = TimedMethodCaller(new Action<int>(TestMethod), 100, "text"); 

// call with several parameters using custom delegate that is defined like this: 
// public delegate void SampleDelegate(string text, int numeric); 
bool success = TimedMethodCaller(new SampleDelegate(TestMethod), 100, "text", 1); 
2

你不能直接進行不可撤銷的撤銷操作(this link描述了與代碼異步異常尚未硬化它的一些問題)。我見過

一種模式是要排隊的工作到另一個線程,但只等待一段時間才能完成,有效地放棄請求時間太長。這不會超出取消範圍,但它可以幫助您保持應用程序的響應。

相關問題