Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何估计方法执行时间?_C#_Callback_Execution Time - Fatal编程技术网

C# 如何估计方法执行时间?

C# 如何估计方法执行时间?,c#,callback,execution-time,C#,Callback,Execution Time,我需要取消方法执行,如果它需要两秒钟以上的时间来完成并在另一个线程上重新启动它 那么,有没有办法/回调机制/黑客,我可以让方法通知我它超过了2秒的时间限制?您应该在两秒钟内创建System.Threading.Timer,然后在另一个线程中运行您的方法并等待它的回调,如果方法在计时器运行之前完成,您应该处理计时器,否则,应该中止正在执行方法的线程。例如,这相当简单 using (new Timer(BreakFunction, true, TimeSpan.FromMinutes(2), Tim

我需要取消方法执行,如果它需要两秒钟以上的时间来完成并在另一个线程上重新启动它


那么,有没有办法/回调机制/黑客,我可以让方法通知我它超过了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中,您应该中止运行您的方法的线程

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

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

if (a.IsAlive)
{
   a.Abort();
}
两件重要的事情:

  • 声明的
    线程
    应由处理计时器的方法可见
  • 调用
    Abort()
    时,会引发异常,因此您应该在方法中正确处理它

    • 异步模式:

      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);
         } 
      
      public static T SafeLimex(函数F,int超时,out bool完成)
      {
      var iar=F.BeginInvoke(null,new object());
      if(iar.AsyncWaitHandle.WaitOne(超时))
      {
      完成=正确;
      返回F.EndInvoke(iar);
      }
      F.EndInvoke(iar);//不调用EndInvoke将导致内存泄漏
      完成=错误;
      返回默认值(T);
      } 
      
      为什么不从一开始就从另一个线程开始呢?老实说,我认为没有任何简单的方法可以精确地完成您的要求。你需要把钩子插得到处都是。为什么坚持首先在调用线程上调用该方法?