C# 在C中创建可重用的方法超时类#

C# 在C中创建可重用的方法超时类#,c#,delegates,C#,Delegates,我正在尝试创建一个类,该类允许我使用指定的timout调用方法。我已经有了实际的超时实现,但是在成功地将其封装到类中时遇到了困难 此时我决定将自己的工作限制为仅处理5个操作委托,以便对采用0-4个参数的方法设置超时。为了这个问题的目的,我将使用行动的单参数变量 我理想的调用语法如下: Action<int> a = new TimeoutAction(i => i + 1) { Timeout = Timespan.FromSeconds(10) } Action a

我正在尝试创建一个类,该类允许我使用指定的timout调用方法。我已经有了实际的超时实现,但是在成功地将其封装到类中时遇到了困难

此时我决定将自己的工作限制为仅处理5个操作委托,以便对采用0-4个参数的方法设置超时。为了这个问题的目的,我将使用行动的单参数变量

我理想的调用语法如下:

Action<int> a = new TimeoutAction(i => i + 1)
{
    Timeout = Timespan.FromSeconds(10)
}
Action a=新超时操作(i=>i+1)
{
超时=时间跨度。从秒(10)
}
或者这个:

Action<int> a = (x => x + 1).Timeout(Timespan.FromSeconds(10))
Action a=(x=>x+1).超时(Timespan.FromSeconds(10))
我几乎可以肯定第一个版本是不可能的,因为无法从委托继承。第二种方法可以通过在
委托
类型上使用扩展方法来实现

最后一种回退方法是创建静态方法,该方法采用适当的委托类型,并返回具有相同签名但包含超时的委托


有什么建议或想法吗?

请使用。或者使用。或者

好吧,lambda表达式将不会“有一个类型”(任何您可以使用的“点”或扩展方法),直到您将其包装在例如

new DelType(lambda)

或者提供上下文,因此我建议最后一个选项(静态方法):


好的,lambda表达式不会“有一个类型”(任何你可以用'dot'或extension方法)直到你把它包装在例如

new DelType(lambda)

或者提供上下文,因此我建议最后一个选项(静态方法):


类似于上述定时锁的方法如何?

类似于上述定时锁的方法如何?

您最后的建议是正确的:

最后的退路是创建 接受 适当的委托类型并返回 具有相同签名但 包括超时

换言之:

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 */

你最后的建议是正确的:

最后的退路是创建 接受 适当的委托类型并返回 具有相同签名但 包括超时

换言之:

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 */
public static TDelegate Timeout<TDelegate>(this TDelegate d, Timespan timespan) where TDelegate : Delegate;