从RichTextBox中删除文本

时间:2009-09-15 11:53:20

标签: c# richtextbox

我的问题:我有Seri​​alPort的DataReceived事件,它侦听串口并将所有内容附加到RichTextBox。现在我想将RichTextBox的内容保存到txt文件中。我能做到这一点:

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

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

这真的会发生吗?我该如何避免呢?

由于

3 个答案:

答案 0 :(得分:2)

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

但是由于来自串口的流不太可能是RTF(如果是这样,你会遇到其他问题),你也可以使用TextBox(MultLine = true)。

答案 1 :(得分:0)

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

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

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

您可以使用c#中的lock语句来实现此目的。

进一步阅读:MutexCritical 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);
}