我为使用Compact Framework的数据收集器开发软件。
我正在检查我正在调用的每个方法,并且我将计算此方法执行的时间。如果这个时间大于或等于1分钟,那么我将抛出异常。我有这个:
public static TResult Call<TResult>(Func<TResult> closure)
{
int ellapsedSeconds = 0;
Timer timer = new Timer { Interval = 1000, Enabled = true };
timer.Tick += delegate
{
ellapsedSeconds++;
if (ellapsedSeconds < 60) return;
timer.Enabled = false;
throw new Exception(@"TimeOut Error Again!");
};
try
{
TResult result = closure.Invoke();
timer.Enabled = false;
return result;
}
catch (Exception)
{
timer.Enabled = false;
throw;
}
}
我知道还有其他方法可以检查,但我不打算改变它。我发布了我的问题域名,但是真正的问题是Timer
没有触发tick事件。它没有名为.Start()
或.Stop()
的扩展方法,就像桌面应用程序一样。 timer.Enabled = true;
并没有开始打勾。
看看:
如何使用紧凑型框架启动Timer?
答案 0 :(得分:3)
Timer依赖于放置在调用者线程上的Windows消息泵。你不会以这种方式收到任何TimerTick事件。
请尝试使用BeginInvoke
技术。本文介绍了该技术 - Calling Synchronous Methods Asynchronously。
答案 1 :(得分:2)
有两个计时器:一个在System.Windows.Forms中,另一个在System.Threading.Thread中。
基于表单的计时器需要一个正在运行的消息泵,因为它发送发出Tick事件处理程序的WM_TIMER消息。如果GUI被阻止,则不会调用Tick处理程序,并且当设备被挂起时,它将不会运行。 http://msdn.microsoft.com/en-us/library/system.windows.forms.timer_members%28v=vs.90%29.aspx Forms计时器没有Start()或Stop()方法,但在使用Enabled = true和false时启动和停止。
基于线程的计时器使用一个线程并在经过时调用回调:http://msdn.microsoft.com/en-us/library/system.threading.timer%28v=vs.90%29.ASPX
您选择了Forms计时器,这是错误的计时器(检查GUI或APP是否挂起),因为如果消息泵被阻止,则不会调用此计时器。你应该切换到线程计时器。