如何在多线程应用程序中使用定时器

本文关键字:定时器 应用程序 多线程 | 更新日期: 2023-09-27 18:18:27

我用c#设计了一个Windows应用程序。应用程序的表单由几个标签和一个按钮组成。当应用程序启动时,我实例化一个UdpListener并使用它启动一个单独的线程,以便在侦听器等待传入数据包时实现响应。当数据到达时,监听线程需要更新表单的控件,为此,我声明了委托函数,并检查每个控件是否需要调用,然后通过这些函数查看它们。

到现在为止,应用程序工作正常。我现在想实现一个计时器功能,这样如果检测到接收数据的暂停时间超过2秒,我想把标签变成红色。我正在尝试使用System.Timers.Timer类,并遵循微软的示例(https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx),我已经实现如下:

private static void SetTimer()
   {
        // Create a timer with a two second interval.
        aTimer = new System.Timers.Timer(2000);
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }
    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
    }  

我调用SetTimer()从我的主要形式。虽然上面的编译,当我尝试替换Console....对于我的控件,比如lblStatus,编译器会抱怨我试图从静态上下文中引用非静态控件。尝试构建类似于我为标签和文本框所做的功能,并使用Invoke方法检查也不起作用。如果有人实现了这样的功能,我将非常感兴趣你对此的意见。

关于这里可能存在的问题的重复,请注意,我已经假设方法和事件是静态的(因为这段代码是从上面引用的示例复制的),因此编译器错误;我知道这个错误意味着什么,我只是对如何从另一个线程引用表单控件感到困惑,因为事件的静态性质。我也很好奇为什么静态事件之后,主机仍然是可访问的;我想这不是一种控制。我希望这对论坛有意义。

如何在多线程应用程序中使用定时器

如果没有来自静态函数的实例引用,就不能访问成员变量。这是因为静态函数不是实例的一部分,它没有访问this的权限。

你应该只是声明你的SetTimerOnTimedEvent作为正常的实例方法,并声明定时器相同(非静态)。这样,你的所有函数都将成为实例的一部分,并且可以访问其他实例变量(控件)。

根据你的问题,你似乎不需要这些都是静态的