C#由于隐式线程而无法调度事件

时间:2013-09-16 02:30:41

标签: c# event-handling thread-safety

我试着编写一个类来制作一个简单的RFID阅读器,在这种情况下它是COM,我想在不同的RFID是红色时发送一个事件,但是由于线程我得到一个错误,我没有直接使用线程,但是SerialPort会这样做。

class LectorCOM
{
    SerialPort puerto;
    public event EventHandler OnLectura;

    public LectorCOM()
    {
        puerto = new SerialPort();
        ...
        puerto.DataReceived += delegate {
             this.OnLectura(this,EventArgs.Empty);
        }; 
    }
 }

但它会引发以下错误:

System.InvalidOperationException未处理   的HResult = -2146233079   消息=Operaciónnoválidaratravésdesubprocesos:Se tuvo acceso al control'textBox2'desde un subproceso distinguished to a aquel en quelocreó。   源= System.Windows.Forms的

我找到了涉及Thread类的解决方案,但我没有使用它,我希望这个类在不同的应用程序中是通用的,所以我不能直接从这个类引用Form1。

提前致谢

1 个答案:

答案 0 :(得分:0)

在系统管理的IO完成端口线程上引发DataReceived线程 该线程无法访问UI。

要解决此问题,您可以在UI图层中的任何控件上调用Invoke()方法,并传递执行UI工作的委托。

您还可以从非UI类中的UI线程(在构造函数的字段中)捕获SynchronizationContext,然后调用其Post()方法以在UI线程上引发整个事件