Pergunta
Meu problema: Eu tenho evento DataReceived para SerialPort, que escuta a porta serial e acrescenta tudo a RichTextBox. Agora eu gostaria de salvar o conteúdo do RichTextBox para arquivo txt. Eu poderia fazer isso:
string text = RichTextBox.Text;
// save file
RichTextBox.Clear();
Mas temo (e por favor me corrijam se eu estiver errado), que só entre as minhas duas ações (salvar conteúdo para variável, RichTextBox claro) outra entrada poderia vir a SerialPort. não porque eu fiz salvou a minha variável e eu claro RichTextBox logo depois, estes novos dados poderiam ser apagados, sem mim mesmo sabendo que já existiu.
Isso poderia realmente acontecer e como posso evitá-lo?
Graças
Solução
Você tem que sincronizar suas entradas a partir do porto de série de alguma forma. Eu suponho que você usar Invoke em caso DataReceived. Assim, quaisquer alterações ao conteúdo do RichTextBox são feitas pelo thread principal e você deve ser seguro.
Mas, como o fluxo da porta serial é improvável que seja RTF (você teria outros problemas se fosse), assim como você pode usar uma caixa de texto (MultLine = true).
Outras dicas
Isso pode acontecer se você estiver usando vários segmentos. Em uma única aplicação fio, este problema não ocorreria.
Para evitar isso, você pode usar exclusão mútua. É assim que funciona: O código trechos que o trabalho sobre o conteúdo do RichTextBox não deve ser executado simultaneamente. Esses trechos de código são chamados de seções críticas. Quando você entra em uma seção crítica, você travar o mutex e liberá-lo ao sair da seção crítica. Se um mutex é bloqueado quando você tentar inserir uma seção crítica, espera até que mutex é liberado, em seguida, fazer o seu trabalho.
Desta forma, se qualquer entrada vem através da porta serial ao gravar o arquivo, o segmento que recebe os dados irá esperar até que o arquivo I / O está terminado e, em seguida, anexá-lo ao RichTextBox.
Você pode conseguir isso usando a bloqueio declaração em C #.
Além disso leitura: Mutex , Seção Critical
Absolutamente que poderia acontecer (e provavelmente seria).
A menos que haja outras considerações, acredito que seria melhor servido usando os dados do fluxo SerialPort para gravar o arquivo de texto diretamente, ao invés de escrever para o arquivo usando o RichTextBox.Text. O manipulador de eventos DataReceived deve ser algo como isto ...
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);
}