CF中的计时器不会打勾

时间:2014-09-05 11:44:32

标签: c# timer delegates compact-framework

我为使用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;并没有开始打勾。 看看:

enter image description here

如何使用紧凑型框架启动Timer?

2 个答案:

答案 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是否挂起),因为如果消息泵被阻止,则不会调用此计时器。你应该切换到线程计时器。