C#SerialPort的自定义组件

时间:2011-02-13 05:52:02

标签: c# thread-safety serial-port

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

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

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

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

  1. 使用委托和调用。
  2. 使用ThreadPool.QueueUserWorkItem。
  3. 但是这些解决方案不会立即执行我的活动。

    现在我希望我的事件能够立即执行而不会出错。

    感谢。

    其他说明:

    计时器组件的 tick 事件发生在经过的时间之后,在其内部您可以使用UI。 所以我希望我的活动就像刻度线一样,我有自己的自定义参数 CustomEventArgs ,打算用它来代替 EventArgs 参数,我该怎么办?

3 个答案:

答案 0 :(得分:1)

您可以运行该事件,但您无法更新UI。因此,根据需要触发事件,无需触摸UI即可完成任何处理,然后执行Invoke更新控件(UI)。

答案 1 :(得分:1)

  

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

     
      
  1. 使用委托和调用。
  2.   
  3. 使用ThreadPool.QueueUserWorkItem。
  4.   

选项2)不适用于此处。选项1)是您的解决方案,您会发现它足够快。它比用户更快,而且重要的是这一切。

只需设计您的系统,以便GUI和非GUI代码之间存在明显的差异。您应该通过使用BeginInvoke()来使GUI延迟更大,以便不阻止您的数据处理。

答案 2 :(得分:0)

首先感谢您的回答。

我找到了一个“跨线程...”错误的解决方案,只需设置 CheckForIllegalCrossThreadCalls = false;

public Form1()
{
    InitializeComponent();
    CheckForIllegalCrossThreadCalls = false; //just add this
}

虽然我发现为什么会有延迟。

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

开销导致延迟。

MSDN Help For ReceivedBytesThreShold