【问题标题】:Creating a reusable method timeout class in C#在 C# 中创建可重用的方法超时类
【发布时间】:2009-04-27 21:14:32
【问题描述】:

我正在尝试创建一个类,它允许我调用具有指定超时的方法。我有实际的超时实现工作,但无法成功地将它封装到一个类中。

此时我已决定将自己限制为仅使用 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 类型上使用扩展方法来实现。

最后的后备方法是创建静态方法,接收适当的委托类型并返回具有相同签名但包含超时的委托。

有什么建议或想法吗?

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    您最后的建议是正确的方法:

    最后的后备方案是创建 采用的静态方法 适当的委托类型并返回一个 具有相同签名的委托,但 包括超时。

    换句话说:

    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;
    

    【讨论】:

      【解决方案2】:

      为此使用AOPPostSharpDynamicProxy

      【讨论】:

        【解决方案3】:

        here 所述的定时锁定方法怎么样?

        【讨论】:

          【解决方案4】:

          嗯,一个 lambda 表达式不会“有一个类型”(任何你可以“点”或扩展方法的东西),直到你将它包装在例如

          new DelType(lambda)
          

          Stat.Method(lambda)
          

          或以其他方式提供上下文,因此我建议使用最终选项(静态方法):

          Timeout.Action(lambda, timeoutVal)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多