2015-10-19 77 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

相關問題