[英]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.