我正在编写一个具有串口(C#Component)的组件以及其他一些函数和事件,当收到数据时会对其进行处理,然后执行相应的事件。
我的问题是: 执行事件时,运行时发生以下错误。
跨线程操作无效:控制“XXXXX”从其创建的线程以外的线程访问。
我搜索并找到了这些解决方案。
但是这些解决方案不会立即执行我的活动。
现在我希望我的事件能够立即执行而不会出错。
感谢。
其他说明:
计时器组件的 tick 事件发生在经过的时间之后,在其内部您可以使用UI。 所以我希望我的活动就像刻度线一样,我有自己的自定义参数 CustomEventArgs ,打算用它来代替 EventArgs 参数,我该怎么办?
答案 0 :(得分:1)
您可以运行该事件,但您无法更新UI。因此,根据需要触发事件,无需触摸UI即可完成任何处理,然后执行Invoke更新控件(UI)。
答案 1 :(得分:1)
我搜索并找到了这些解决方案。
- 使用委托和调用。
- 使用ThreadPool.QueueUserWorkItem。
醇>
选项2)不适用于此处。选项1)是您的解决方案,您会发现它足够快。它比用户更快,而且重要的是这一切。
只需设计您的系统,以便GUI和非GUI代码之间存在明显的差异。您应该通过使用BeginInvoke()来使GUI延迟更大,以便不阻止您的数据处理。
答案 2 :(得分:0)
首先感谢您的回答。
我找到了一个“跨线程...”错误的解决方案,只需设置 CheckForIllegalCrossThreadCalls = false; 。
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false; //just add this
}
虽然我发现为什么会有延迟。
.Net的 SerialPort 具有 ReceivedBytesThreShold 名称和1个默认值的属性。通常我收到的数据包大小超过50。
开销导致延迟。