2009-04-27 88 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

相关问题