我設計了一個使用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'關鍵字? –