2009-04-27 43 views
1

我想創建一個類,讓我調用指定的timout方法。我有實際的超時實現工作,但無法成功地將其封裝到類中。在C#中創建一個可重用的方法超時類

我在這個時候決定限制自己只處理5個Action委託,對需要0-4個參數的方法施加超時。爲了這個問題的目的,我將使用Action的一個參數變體。

我的理想調用語法將是這樣的:

Action<int> a = new TimeoutAction(i => i + 1) 
{ 
    Timeout = Timespan.FromSeconds(10) 
} 

或本:

Action<int> a = (x => x + 1).Timeout(Timespan.FromSeconds(10)) 

我幾乎可以肯定的是,第一個版本心不是可能的,因爲沒有辦法從一個繼承代表。第二種可能是在Delegate類型上使用擴展方法。

最後的回退是創建一個靜態方法,它接受相應的委託類型並返回一個具有相同簽名但包含超時的委託。

任何意見或建議?

回答

2

你最後的建議是正確的做法:

是最終的後備是創建 表示誠摯的 適當的委託類型靜態方法和具有相同簽名但 與返回 代表包括超時。

換句話說:

public static Action<T> Timeout<T>(this Action<T> action, TimeSpan timeSpan); 
public static Action<T1, T2> Timeout<T1, T2>(this Action<T1, T2> action, TimeSpan timeSpan); 
public static Func<T, TResult> Timeout<T, TResult>(this Func<T, TResult> action, TimeSpan timeSpan); 
public static Func<T1, T2, TResult> Timeout<T1, T2, TResult>(this Func<T1, T2, TResult> action, TimeSpan timeSpan); 
/* snip the rest of the Action<...> and Func<...> overloads */ 

「爲什麼我不能只是聲明瞭一個方法?」

您可以聲明一種方法,它接受Delegate並返回Delegate,但這樣會丟失委託類型信息(第二個示例不會編譯)。

不幸的是,下面的例子是無效的C# - 你不能使用Delegate作爲一個類型參數約束:

public static TDelegate Timeout<TDelegate>(this TDelegate d, Timespan timespan) where TDelegate : Delegate; 
-1

那麼,一個lambda表達式不會「有一個類型」(任何你可以'點'或擴展方法),直到你把它包裝在例如。

new DelType(lambda) 

Stat.Method(lambda) 

或以其他方式提供上下文,所以我建議的最後一個選項(靜態方法):

Timeout.Action(lambda, timeoutVal) 
0

如何類似的方法來定時鎖所描述here

相關問題