我的问题:我有 SerialPort 的 DataReceived 事件,它侦听串行端口并将所有内容附加到 RichTextBox。现在我想将RichTextBox的内容保存到txt文件中。我可以这样做:

string text = RichTextBox.Text;
// save file
RichTextBox.Clear();

但我担心(如果我错了,请纠正我),就在我的两个操作(将内容保存到变量、清除 RichTextBox)之间,另一个输入可能会到达 SerialPort。因为我没有将其保存到我的变量中,并且我在它之后立即清除了 RichTextBox,所以可以删除这些新数据,而我什至不知道它曾经存在过。

这种情况真的会发生吗?我该如何避免?

谢谢

有帮助吗?

解决方案

您必须以某种方式同步来自串行端口的输入。我假设您在 DataReceived 事件中使用 Invoke。因此,对 RichTextBox 内容的任何更改都是由主线程完成的,您应该是安全的。

但由于来自串行端口的流不太可能是 RTF(如果是,则会遇到其他问题),因此您不妨使用 TextBox (MultLine=true)。

其他提示

如果您使用多个线程,则可能会发生这种情况。在单线程应用程序中,不会出现这个问题。

为了防止这种情况,您可以使用互斥体。它是这样工作的:对 RichTextBox 内容起作用的代码片段不应同时执行。这些代码片段称为关键部分。当进入临界区时,锁定互斥体并在退出临界区时释放它。如果当您尝试进入临界区时互斥体被锁定,请等到该互斥体被释放,然后再执行您的工作。

这样,如果在写入文件时有任何输入通过串行端口,接收数据的线程将等待文件 I/O 完成,然后将其附加到 RichTextBox。

您可以通过使用来实现这一点 c# 中的语句。

进一步阅读: 互斥体, 关键部分

这绝对有可能发生(而且很可能会发生)。

除非有其他考虑,我相信使用 SerialPort 流中的数据直接写入文本文件会更好,而不是使用 RichTextBox.Text 写入文件。DataReceived 事件处理程序应该看起来像这样......

private void SerialPort1.DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string DataText = // code to read the serialport data and convert 
   //it into a string, which you already have so I 
   //won't repeat it here.

   WriteToTextBox(DataText);
   WriteToFile(DataText);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top