[英]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 。 PostSharp或DynamicProxy
像這里描述的定時鎖定方法怎么樣?
好吧,直到您將lambda表達式包裝到例如中之后,它才會“具有類型”(您可以“加點”或擴展方法的任何內容)
new DelType(lambda)
要么
Stat.Method(lambda)
或提供上下文,所以我建議使用最后一個選項(靜態方法):
Timeout.Action(lambda, timeoutVal)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.