4

如果需要超过两秒钟才能完成并在另一个线程上重新启动它,我需要取消方法执行。

那么,有什么方法/回调机制/HACK,我可以让方法告诉我它超过了 2 秒的时间限制吗?

4

3 回答 3

4

在 c# https://web.archive.org/web/20140222210133/http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution中检查网络驱动器是否存在超时
-时间

异步模式:

public static T SafeLimex<T>(Func<T> F, int Timeout, out bool Completed)   
   {
       var iar = F.BeginInvoke(null, new object());
       if (iar.AsyncWaitHandle.WaitOne(Timeout))
       {
           Completed = true;
           return F.EndInvoke(iar);
       }
         F.EndInvoke(iar); //not calling EndInvoke will result in a memory leak
         Completed = false;
       return default(T);
   } 
于 2011-02-17T07:37:28.227 回答
2

您应该在两秒钟内创建 System.Threading.Timer,然后在另一个线程中运行您的方法并等待来自它的回调,如果方法在计时器运行之前完成,您应该处置计时器,否则您应该中止正在执行您的方法的线程。例如,这很简单

using (new Timer(BreakFunction, true, TimeSpan.FromMinutes(2), Timeout.Infinite))
                    {
                        //TODO:here you should create another thread that will run your method
                    }

在 BreakFunction 你应该中止运行你的方法的线程

于 2011-02-17T05:54:39.117 回答
1

如果能找到就好了。我也一直在寻找它。

我通常做的是在 another 中启动该方法,并在这种情况下以 2 秒Thread启动 a 。Timer第一次引发事件时,只需执行以下操作:

if (a.IsAlive)
{
   a.Abort();
}

两个重要的事情:

  • 声明的Thread应该对处理计时器的方法可见
  • 调用时Abort(),它会引发ThreadAbortException,因此您应该在方法中正确处理它。
于 2011-02-17T06:03:25.487 回答