【发布时间】:2015-10-20 12:48:13
【问题描述】:
我使用 C# 设计了一个 Windows 应用程序。应用程序的表单由几个标签和一个按钮组成。当应用程序启动时,我实例化一个 UdpListener 并用它启动一个单独的线程,以便在侦听器等待传入数据包时实现响应。当数据到达时,监听线程需要更新表单的控件,为此我已经声明了委托函数,并在通过这些函数查看它们之前检查每个控件是否需要调用。
到目前为止,该应用程序运行良好。我现在想实现一个计时器功能,这样如果检测到接收数据的暂停时间超过 2 秒,我想将标签变为红色。我正在尝试使用 System.Timers.Timer 类,并按照 Microsoft 的示例 (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 方法检查也不起作用。如果有人实现了这样的功能,我会非常感兴趣你对此的看法。
关于此处现有问题的可能重复,请注意我假设方法和事件 必须 是静态的(因为此代码是从上面引用的示例中复制的) ,因此编译器错误;我知道错误意味着什么,我只是对如何在考虑到事件的静态性质的情况下从另一个线程引用表单控件感到困惑。我也很好奇那个静态事件是怎么来的,控制台仍然可以访问;我想它不被视为控制。我希望这对论坛有意义。
【问题讨论】:
-
ResetTimer()是什么?您的样本是SetTimer。另外,atimer是什么 - 您的样本没有声明它。是不是表单中的成员变量? -
aTimer 在我的表单中被声明为 Timer aTimer;然后在上面的 SetTimer() 方法中实例化。
-
为什么不能只删除
static关键字? -
从哪里删除静态关键字?方法、事件处理程序或两者兼而有之?