如何在时间范围内从方法或属性返回任何类型的数据,如果在该时间范围内返回任何数据,则抛出异常?
我有一个简单的方法可以执行一个简单的任务,一旦执行该方法返回一个值,如果在100毫秒内返回任何值,我希望该方法被中止并抛出异常,例如a TimeoutException
例如,任何类型的异常,只要它执行任务。
答案 0 :(得分:8)
如果您有权访问.NET 4,我建议您查看新的Task类。使用您想要完成的工作创建一个任务并启动它。 Wait方法允许您指定超时值。等待返回bool,因此您知道是否发生了超时。
答案 1 :(得分:5)
如果您使用的是.NET 3.5并且无法使用Parallel Extensions,则可以使用异步委托。这具有额外的好处,即重新抛出该方法在调用线程上抛出的异常。此示例中的超时逻辑依赖于WaitHandle,如leppie所述。
public static T EvaluateAsync<T> (this Func<T> func, Timespan timeout)
{
var result = func.BeginInvoke(null, null);
if (!result.AsyncWaitHandle.WaitOne(timeout))
throw new TimeoutException ("Operation did not complete on time.");
return func.EndInvoke(result);
}
static void Example()
{
var myMethod = new Func<int>(ExampleLongRunningMethod);
// should return
int result = myMethod.EvaluateAsync(TimeSpan.FromSeconds(2));
// should throw
int result2 = myMethod.EvaluateAsync(TimeSpan.FromMilliseconds(100));
}
static int ExampleLongRunningMethod()
{
Thread.Sleep(1000);
return 42;
}
答案 2 :(得分:2)
查看WaitHandle
及其推导。应该做你想做的事。
答案 3 :(得分:2)
答案 4 :(得分:0)
嗯 - 您可以在不同的线程上启动该方法,如果线程未在规定的时间范围内返回,则中止它。虽然,如果你正在寻找非常小的时间框架,那么这种方式将涉及很大的开销。 (顺便说一下,你可以使用Thread.Join重载来等待规定的时间)。