【问题标题】:How to estimate method execution time?如何估计方法执行时间?
【发布时间】:2011-02-17 05:47:43
【问题描述】:

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

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

【问题讨论】:

  • 你为什么不在另一个线程上从头开始呢?
  • 老实说,我认为没有任何简单的方法可以精确地按您的要求行事。您需要在整个地方插入挂钩。为什么一定要先在调用线程上调用方法?

标签: c# callback execution-time


【解决方案1】:

check if network drive exists with timeout in c#
https://web.archive.org/web/20140222210133/http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution-time

异步模式:

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);
   } 

【讨论】:

    【解决方案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 中,您应该中止运行您的方法的线程

    【讨论】:

      【解决方案3】:

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

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

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

      两件重要的事情:

      • 声明的Thread 应该对处理计时器的方法可见
      • 调用Abort()时会引发ThreadAbortException,所以在方法中要正确处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-14
        • 2017-11-16
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 2012-12-10
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多