[英]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.