簡體   English   中英

在C#中創建可重用的方法超時類

[英]Creating a reusable method timeout class in C#

我試圖創建一個類,使我可以使用指定的timout調用方法。 我有實際的超時實現工作,但是無法成功將其封裝到類中。

我目前決定將自己限制為僅與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類型的擴展方法,可以實現第二種方法。

最后的后備方法是創建采用適當委托類型的靜態方法,並返回具有相同簽名但包括超時的委托。

有什么建議或想法嗎?

您最后的建議是正確的方法:

最后的后備方法是創建采用適當委托類型的靜態方法,並返回具有相同簽名但包括超時的委托。

換一種說法:

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;

為此使用AOP PostSharpDynamicProxy

這里描述的定時鎖定方法怎么樣?

好吧,直到您將lambda表達式包裝到例如中之后,它才會“具有類型”(您可以“加點”或擴展方法的任何內容)

new DelType(lambda)

要么

Stat.Method(lambda)

或提供上下文,所以我建議使用最后一個選項(靜態方法):

Timeout.Action(lambda, timeoutVal)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM