我设计了一个使用C#的Windows应用程序。应用程序的表单由几个标签和一个按钮组成。当应用程序启动时,我实例化一个UdpListener,并使用它启动一个单独的线程,以便在侦听器等待传入数据包时实现响应。当数据到达时,监听线程需要更新表单的控件,为此我已经声明了委托函数,并且在通过这些函数查看它们之前需要调用时检查每个控件。如何在多线程应用程序中使用Timer
该应用程序工作良好,直到现在。我现在想要实现一个定时器功能,例如,如果检测到接收数据超过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的()从我的主要形式。虽然上面编译,当我尝试用我的控件替换控制台,说lblStatus,编译器抱怨说,我试图从静态上下文中引用非静态控件。试图构建类似于标签和文本框的函数,并且使用Invoke方法检查也不起作用。如果任何人已经实现了这样的功能,我会对你的意见非常感兴趣。
关于此处可能存在的重复问题,请注意,我假定方法和事件的是静态的(因为此代码是从上面引用的示例复制的),因此编译器错误;我知道这个错误的含义,我只是困惑于如何从另一个线程引用表单控件给定事件的静态属性。我也很好奇这个静态事件是如何发生的,Console仍然可以访问;我想这不是一个控制。我希望这对论坛有意义。
什么是ResetTimer()?你的例子是SetTimer。另外,什么是'atimer' - 你的样本没有声明它。它是表单中的成员变量吗? – xxbbcc
aTimer在我的表单中声明为Timer aTimer;然后在SetTimer()方法中像上面那样实例化。 – user1012598
为什么你不能删除'static'关键字? –