2015-10-19 94 views
-1

我设计了一个使用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仍然可以访问;我想这不是一个控制。我希望这对论坛有意义。

+0

什么是ResetTimer()?你的例子是SetTimer。另外,什么是'atimer' - 你的样本没有声明它。它是表单中的成员变量吗? – xxbbcc

+0

aTimer在我的表单中声明为Timer aTimer;然后在SetTimer()方法中像上面那样实例化。 – user1012598

+1

为什么你不能删除'static'关键字? –

回答

0

如果没有静态函数的实例引用,则无法访问成员变量。这是因为静态函数不是实例的一部分,它无法访问this

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

根据你的问题,你似乎并不需要任何这些是静态的。

+0

谢谢你的意思是我可以将计时器声明为私有?它的事件虽然...不需要是静态的吗? – user1012598

+0

这样做...... SUPER谢谢! – user1012598

相关问题