如何为繁忙的方法+ C#设置超时。

最佳答案

好的,这是真正的答案。

...

void LongRunningMethod(object monitorSync)
{
   //do stuff
   lock (monitorSync) {
     Monitor.Pulse(monitorSync);
   }
}

void ImpatientMethod() {
  Action<object> longMethod = LongRunningMethod;
  object monitorSync = new object();
  bool timedOut;
  lock (monitorSync) {
    longMethod.BeginInvoke(monitorSync, null, null);
    timedOut = !Monitor.Wait(monitorSync, TimeSpan.FromSeconds(30)); // waiting 30 secs
  }
  if (timedOut) {
    // it timed out.
  }
}

   ...

这结合了使用C#的两个最有趣的部分。首先,要异步调用该方法,请使用具有花哨的裤子BeginInvoke魔术的委托(delegate)。

然后,使用监视器将消息从LongRunningMethod发送回ImpatientMethod,以告知它何时完成,或者如果在一定时间内没有收到消息,则放弃它。

(p.s.-只是在开 Jest ,这才是真正的答案。我知道有2 ^ 9303种方法可以使猫皮毛。尤其是在.Net中)

10-08 14:29