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);
}
为什么不从一开始就从另一个线程开始呢?老实说,我认为没有任何简单的方法可以精确地完成您的要求。你需要把钩子插得到处都是。为什么坚持首先在调用线程上调用该方法?