代码之家  ›  专栏  ›  技术社区  ›  Fábio Antunes

等待100毫秒,等待从方法else throw exception返回的数据

  •  3
  • Fábio Antunes  · 技术社区  · 14 年前

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

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

    5 回复  |  直到 8 年前
        1
  •  5
  •   Ani    14 年前

    如果您使用的是.NET3.5并且不能使用并行扩展,那么可以使用异步委托。这还有一个额外的好处,就是在调用线程上重新引发方法抛出的异常。本例中的超时逻辑依赖于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
  •  8
  •   Brian Rasmussen    14 年前

    Wait 方法允许您指定超时值。Wait返回bool,这样您就知道是否发生了超时。

        3
  •  2
  •   leppie    14 年前

    WaitHandle 它是派生的。你应该做你想做的。

        5
  •  0
  •   VinayC    14 年前