我的问题:我有SerialPort的DataReceived事件,它侦听串口并将所有内容附加到RichTextBox。现在我想将RichTextBox的内容保存到txt文件中。我能做到这一点:
string text = RichTextBox.Text;
// save file
RichTextBox.Clear();
但是我担心(如果我错了请纠正我),在我的两个动作之间(将内容保存到变量,清除RichTextBox),另一个输入可以来到SerialPort。因为我没有将它保存到我的变量中并且我在它之后立即清除了RichTextBox,所以可以删除这些新数据,而我甚至不知道它曾经存在过。
这真的会发生吗?我该如何避免呢?
由于
答案 0 :(得分:2)
您必须以某种方式从串行端口同步输入。我假设您在DataReceived事件中使用Invoke。因此,对RichTextBox内容的任何更改都是由主线程完成的,您应该是安全的。
但是由于来自串口的流不太可能是RTF(如果是这样,你会遇到其他问题),你也可以使用TextBox(MultLine = true)。
答案 1 :(得分:0)
如果您使用多个线程,可能会发生这种情况。在单线程应用程序中,不会发生此问题。
为防止这种情况,您可以使用互斥锁。这是它的工作原理:不应该同时执行处理RichTextBox内容的代码片段。这些代码段称为关键部分。当您进入临界区时,锁定互斥锁并在退出临界区时将其释放。如果在尝试进入临界区时锁定了互斥锁,请等到该互斥锁被释放,然后再开始工作。
这样,如果在写入文件时通过串口输入任何输入,则接收数据的线程将等待文件I / O完成,然后将其附加到RichTextBox。
您可以使用c#中的lock语句来实现此目的。
进一步阅读:Mutex,Critical Section
答案 2 :(得分:0)
绝对可能发生(也可能发生)。
除非有其他考虑因素,否则我相信使用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);
}