C#SerialPort的自定义组件

C#SerialPort的自定义组件,c#,thread-safety,serial-port,C#,Thread Safety,Serial Port,我正在编写一个组件,它有一个串行端口(C#组件)和一些其他函数和事件,当接收到数据时,会对其进行处理,然后执行相应的事件 我的问题是: 执行事件时,在运行时发生以下错误 跨线程操作无效:从创建控件“XXXXX”的线程以外的线程访问控件“XXXXX” 我搜索并找到了这些解决方案 使用委托和调用 使用ThreadPool.QueueUserWorkItem 但这些解决方案不会立即运行我的事件 现在,我希望我的事件能够立即无误地执行 谢谢 其他说明: 计时器组件的滴答声事件发生在经过的时间之后,您可以

我正在编写一个组件,它有一个串行端口(C#组件)和一些其他函数和事件,当接收到数据时,会对其进行处理,然后执行相应的事件

我的问题是: 执行事件时,在运行时发生以下错误

跨线程操作无效:从创建控件“XXXXX”的线程以外的线程访问控件“XXXXX”

我搜索并找到了这些解决方案

  • 使用委托和调用
  • 使用ThreadPool.QueueUserWorkItem
  • 但这些解决方案不会立即运行我的事件

    现在,我希望我的事件能够立即无误地执行

    谢谢

    其他说明:

    计时器组件的滴答声事件发生在经过的时间之后,您可以在其中使用UI。
    因此,我希望我的事件像tick一样,我有自己的自定义参数CustomEventArgs,并打算使用它来代替EventArgs参数,我该怎么办?

    您可以运行事件,但无法更新UI。因此,可以随意触发事件,在不接触UI的情况下执行任何需要执行的处理,然后执行更新控件(UI)的操作

    我搜索并找到了这些解决方案

  • 使用委托和调用
  • 使用ThreadPool.QueueUserWorkItem
  • 选项2)在此不适用。选项1)是您的解决方案,您会发现它足够快。它比用户更快,这才是最重要的


    只需设计您的系统,就可以在GUI和非GUI代码之间划分出一个明显的界限。您可能应该使用BeginInvoke()使GUI延迟更大,以免阻塞数据处理

    首先感谢您的回答

    我找到了一个解决“cross thread…”错误的方法,只需设置CheckForIllegalCrossThreadCalls=false

    public Form1()
    {
        InitializeComponent();
        CheckForIllegalCrossThreadCalls = false; //just add this
    }
    
    虽然我发现了为什么会耽搁

    .Net的SerialPort的属性具有ReceivedBytestThreshold名称和1个默认值。通常我收到的数据包大小超过50个

    开销是导致延迟的原因


    我想在UI中立即显示处理后的数据,我的PC串行端口连接了一个摄像头,它以57600的波特率连续发送命令。六个命令中有一个是GPS位置命令。我需要向用户显示此命令的数据。如何查看数据?您可以从串行端口存储数据,以便用户界面以后可以访问它。如果需要查看所有值,请将数据排队。如果您只需要最新的值,请存储最新的值并让UI访问它(注意在两个线程中的访问周围使用“锁定”)。这应该发生得足够快,以显示“实时”。您也可以在UI线程上同步读取串行端口,但UI响应可能会变得不稳定。您不能将其放在循环中,因为UI线程需要处理绘制消息。您需要使用Windows.Forms计时器进行轮询。