繁体   English   中英

C#线程问题

[英]C# Threads issue

我想做一件简单的事。

我有一个辅助线程听取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
    }

所以,听读者需要在单独的线程上出于显而易见的原因,但第二种方法必须从主线程完成,所以我使用一个事件,但如果你有另一个想法。

谢谢

由于您添加了[picturebox]标记,我们可以假设这是Windows Forms(Winforms)。 读者线程的事件处理程序将在读者线程上执行,您需要在UI线程上执行代码(以响应事件)。

您可以使用Form的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);
}

counter方法可以检查当前线程是否可以更新图片框,如果没有,它可以将执行传递给可能是这样的线程:

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

    pictureBox.Image = Resources._5;
}

我还建议您使用Pascal案例作为您的方法名称 - 这是非常标准的。 资本化公约

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM