2

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

例如,我们有一个类似的函数:

T DoLengthyOperation()

使用Func我们有:

Func<T>

这很好,甚至调用函数Sync( Invloke) 或Async( BeginInvoke)。现在考虑将 aTimeOut添加到此行为中,如果DoLengthyOperation()在指定时间内返回我们已经true返回,否则false.

就像是:

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

3 回答 3

1

实现 C# 通用超时

于 2010-12-19T11:11:11.830 回答
0

不要为完成返回真/假。抛出异常。

我没有时间来实现它,但它应该是可能的,你的基本签名看起来像这样:

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

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

于 2010-12-15T18:17:38.637 回答
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. 将超时的概念根植于操作本身,并让它在操作中的许多点检查时间是否过期。

哪个最适合您很难确定,因为我们对您的方案了解不够。我的直觉是选择#2 或#3。让主代码不必切换线程可能是对代码影响最小的更改。

于 2010-12-15T18:36:41.777 回答