2012-07-20 126 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