等待100毫秒,从方法返回的数据抛出异常

时间:2010-08-24 11:21:41

标签: c# .net asynchronous timeout

如何在时间范围内从方法或属性返回任何类型的数据,如果在该时间范围内返回任何数据,则抛出异常?

我有一个简单的方法可以执行一个简单的任务,一旦执行该方法返回一个值,如果在100毫秒内返回任何值,我希望该方法被中止并抛出异常,例如a TimeoutException例如,任何类型的异常,只要它执行任务。

5 个答案:

答案 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重载来等待规定的时间)。