使用C# 4.0
功能我需要一个通用的包装器来封装函数,并为它们添加TimeOut
参数。
例如,我们有一个函数:
T DoLengthyOperation()
使用Func
我们有:
Func<T>
这很好,甚至可以Sync
(Invloke
)或Async
(BeginInvoke
)调用该函数。
现在考虑将TimeOut
添加到此行为中,如果DoLengthyOperation()
在指定时间内返回,则会返回true
,否则为false
。
类似的东西:
FuncTimeOut<in T1, in T2, ..., out TResult, int timeOut, bool result>
答案 0 :(得分:1)
答案 1 :(得分:0)
完整后不要返回true / false。抛出异常。
我没有时间实现它,但它应该是可能的,您的基本签名将如下所示:
T DoLengthyOperation<T>(int TimeoutInMilliseconds, Func<T> operation)
你可以通过传入任何Func&lt; T&gt;的名称来调用这个方法。作为参数或将其定义为lambda表达式。不幸的是,您还需要为您想要的不同类型的函数提供重载,因为目前无法将变量数指定为泛型类型参数。
答案 2 :(得分:0)
而不是混合out
和bool
我会改为构造一个单独的类型来捕获返回。例如
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;
}
}
这绝对可以写。唯一的问题是,为了实现超时,必须执行以下操作之一
哪种方法最适合您很难确定,因为我们对您的方案了解不够。我的直觉是去#2或#3。使主代码不必切换线程可能是对代码影响最小的更改。