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