2012-07-20 125 views
0

我想做一件簡單的事情。C#線程問題

我有一個輔助線程正在聽USB讀卡器,當讀卡器「讀取」某些內容時,線程會觸發一個事件。那個事件啓動一個計時器,但計時器不起作用,我相信這是因爲關於線程。

此外,計時器必須更改窗體中的一些圖像,所以這必須在主線程中完成。

我希望我很清楚。

private void listenReader() 
    { 
     while (whileState) 
     { 

       if (readsSomething) 
       { 
        evt.OnSomeEvent(); 
        break; 
       } 

     } 
    } 

    private void eventStartsThisMethot(){ 
     //do a lot of things and start the timer 
     } 

    private void counter(){ 
     pictureBox.Image = Resources._5; 
    //the timer ticks this methot 
    } 

所以,聽讀者必須對原因很明顯單獨的線程,但第二個方法必須從主線程來完成,所以我用一個事件,但如果你有另一個想法。

感謝

+1

因此,如果該線程觸發啓動計時器的事件,誰正在監聽此計時器?另外,你正在使用哪個計時器類? – leppie 2012-07-20 21:44:21

+3

澤維爾,如果沒有發佈能夠證明您的問題的代碼示例,將很難獲得任何有意義的答案。 – 2012-07-20 21:45:30

+1

'我希望我明白:S'我恐怕你不是。 – 2012-07-20 21:53:00

回答

2

既然你加入[圖片框]標籤,我們可以認爲這是Windows窗體(的WinForms)。您的閱讀器線程的事件處理程序將在閱讀器線程上執行,並且需要在UI線程上執行代碼(以響應事件)。

您可以使用窗體的BeginInvoke方法在UI線程上執行任意代碼

private void ProcessMessageOnUIThread(YourMessageType msg) 
{ 
    // Process here 
} 

private void ReaderThreadEventHandler(YourMessageType msg) 
{ 
    // Invoke the UI thread to process the message 
    BeginInvoke(new Action(ProcessMessageOnUIThread), msg); 
} 
+0

這就是它:)非常感謝 – 2012-07-20 22:20:31

0

計數器方法可以檢查當前線程可以更新圖片框,如果沒有,就可以通過執行來可以這樣的線程:

private void Counter() 
{ 
    if (pictureBox.InvokeRequired) 
    { 
     Action action = Counter; 
     pictureBox.Invoke(action); 
     return; 
    } 

    pictureBox.Image = Resources._5; 
} 

我還建議你使用Pascal格爲你的方法名稱 - 這是非常標準的。 Capitalization Conventions