【问题标题】:SerialPort (SerialDataReceivedEventArgs) System.InvalidOperationExceptionSerialPort (SerialDataReceivedEventArgs) System.InvalidOperationException
【发布时间】:2016-09-12 13:07:14
【问题描述】:

抛出异常:“System.InvalidOperationException”在 WindowsBase.dll 附加信息: Impossibile accedere all'oggetto dal thread chiamante perché tale oggetto è di proprietà di un altro thread。

public partial class MainWindow : Window
{
    int baudRate { get; }
    Parity parity { get; }
    int dataBits { get; }
    StopBits stopBits { get; }
    Handshake handshake { get; }
    string portName { get; }
    MainWindow mainWindow;
    SerialPort _serialPort { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        //var conf = new ConfigScanner(this);
        var conf_file_path = string.Format("{0}scannerCOMconf.ini", AppDomain.CurrentDomain.BaseDirectory);
        if (!File.Exists(conf_file_path)) return;
        string[] fileConf = File.ReadAllLines(conf_file_path);
        portName = fileConf[0];
        baudRate = Convert.ToInt32(fileConf[1]);
        parity = (Parity)Enum.Parse(typeof(Parity), fileConf[2]);
        dataBits = Convert.ToInt32(fileConf[3]);
        stopBits = (StopBits)Enum.Parse(typeof(StopBits), fileConf[4]);
        handshake = (Handshake)Enum.Parse(typeof(Handshake), fileConf[5]);
        Open();
    }


    public bool Open()
    {
        _serialPort = new SerialPort();
        try
        {
            _serialPort.BaudRate = baudRate;
            _serialPort.DataBits = dataBits;
            _serialPort.Handshake = handshake;
            _serialPort.Parity = parity;
            _serialPort.PortName = portName;
            _serialPort.StopBits = stopBits;
            _serialPort.DataReceived += new SerialDataReceivedEventHandler(scanBarcode);
            _serialPort.Open();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            return false;
        }
        return true;
    }

    void scanBarcode(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();            
        Console.Write(indata);
        /*
         Exception thrown: 'System.InvalidOperationException' in WindowsBase.dll
         Additional information: 
         Impossibile accedere all'oggetto dal thread chiamante 
         perché tale oggetto è di proprietà di un altro thread.*/
        textbox1.Text = indata;
    }
}

【问题讨论】:

  • 看看 SerialDataReceivedEventHandler 类,msdn.microsoft.com/en-us/library/… 当从 SerialPort 对象接收到数据时,DataReceived 事件在辅助线程上引发。由于此事件是在辅助线程而不是主线程上引发的,因此尝试修改主线程中的某些元素(例如 UI 元素)可能会引发线程异常。您需要参考上面关于如何从单独线程更新 GUI 的评论。

标签: c# multithreading exception serial-port


【解决方案1】:

您可以使用委托在正确的线程中调用 GUI 内容。我会做类似的事情:

void scanBarcode(object sender, SerialDataReceivedEventArgs e)
{
    string indata = _serialPort.ReadExisting();            

    this.Invoke((MethodInvoker)delegate
    {
        textbox1.Text = indata;
    }
}

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多