将“TimeOut”参数添加到“Func<>”在C#4.0中

时间:2010-12-15 18:12:54

标签: c#-4.0 timeout func

使用C# 4.0功能我需要一个通用的包装器来封装函数,并为它们添加TimeOut参数。

例如,我们有一个函数:

T DoLengthyOperation()

使用Func我们有:

Func<T>

这很好,甚至可以SyncInvloke)或AsyncBeginInvoke)调用该函数。 现在考虑将TimeOut添加到此行为中,如果DoLengthyOperation()在指定时间内返回,则会返回true,否则为false

类似的东西:

FuncTimeOut<in T1, in T2, ..., out TResult, int timeOut, bool result>

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

完整后不要返回true / false。抛出异常。

我没有时间实现它,但它应该是可能的,您的基本签名将如下所示:

T DoLengthyOperation<T>(int TimeoutInMilliseconds, Func<T> operation)

你可以通过传入任何Func&lt; T&gt;的名称来调用这个方法。作为参数或将其定义为lambda表达式。不幸的是,您还需要为您想要的不同类型的函数提供重载,因为目前无法将变量数指定为泛型类型参数。

答案 2 :(得分:0)

而不是混合outbool我会改为构造一个单独的类型来捕获返回。例如

struct Result<T> {
  private bool _isSuccess;
  private T _value;
  public bool IsSucces { get { return _success; } }
  public T Value { get { return _value; } }
  public Result(T value) {
    _value = value;
    _isSuccess = true;
  }
}

这绝对可以写。唯一的问题是,为了实现超时,必须执行以下操作之一

  1. 将长时间运行的操作移到另一个线程上。
  2. 为长时间运行的操作添加取消支持,并从另一个线程中取消信号。
  3. 将超时的概念Ingrain引入操作本身并让它检查操作中许多点的到期时间。
  4. 哪种方法最适合您很难确定,因为我们对您的方案了解不够。我的直觉是去#2或#3。使主代码不必切换线程可能是对代码影响最小的更改。