SerialPort (SerialDataReceivedEventArgs) System.InvalidOpera

本文关键字:System InvalidOpera SerialDataReceivedEventArgs SerialPort | 更新日期: 2023-09-27 18:06:35

引发异常:中的"System.InvalidOperationException"WindowsBase.dll附加信息:不可能加速所有"ggetto dal thread chiamante"这是一个故事。

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;
    }
}

SerialPort (SerialDataReceivedEventArgs) System.InvalidOpera

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

void scanBarcode(object sender, SerialDataReceivedEventArgs e)
{
    string indata = _serialPort.ReadExisting();            
    this.Invoke((MethodInvoker)delegate
    {
        textbox1.Text = indata;
    }
}