繁体   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