私はシリアルポート関連のアプリケーションに取り組んでいます。DataReceived
のイベントを使用している間SerialPort
、受信したバイトでテキストボックスを更新する必要があります。
private void Connection_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var data = Connection.ReadExisting();
_readBuffer.Add(indata);
Invoke(new EventHandler(AddReceivedPacketToTextBox));
}
だから私Invoke
はテキストボックスを更新するために使用します。しかし、大きな問題があります。接続を閉じようとすると、UIがフリーズします。これは、Invoke
おそらく何かをしているためだと思います。
友人RequiredInvoke
が私が使うべきだと言ったが、彼が本当に何を言っているのか私にはわからない。呼び出しスレッドとUIスレッドを台無しにせずに接続を閉じるにはどうすればよいですか?
これが私の閉じる方法です:
private void DisconnectFromSerialPort()
{
if (Connection != null && Connection.IsOpen)
{
Connection.Close();
}
}
アップデート
ハンスが私に変更Invoke
したと言ったが、今は少し悪くなっているが、コレクションが変更されたためBeginInvoke
にアプリケーションが機能しなくなった(VSで詳細が述べていること)InvalidOperationException
_readBuffer
テキストボックスにテキストを追加するための私のコードは次のとおりです。
private void AddReceivedPacketToTextBox(object sender, EventArgs e)
{
foreach (var i in _readBuffer)
tbIn.Text += string.Format("{0:X2} ", i);
tbIn.Text += Environment.NewLine;
ScrollToBottom(tbIn);
label4.Text = _receivedPackets.ToString();
_receivedPackets++;
_readBuffer.Clear(); //Possibly because clearing collection gets out of sync with BeginInvoke??
}
2回目の更新
私はまだ問題を抱えており、を変更しInvoke()
ましたBeginInvoke
;助けにはなりません。また、フォームを閉じるイベントnu successに切断を追加しようとしました...フォームを閉じるといつでも在庫があります(シリアルポートにアクセスできるこのフォームは別のフォームから呼び出されているため、親フォームを意味します`。
つまり、UIがロックされるのは2つの場合だけであることがわかりました。Connection.Close()
フォームを閉じようとしても呼び出すボタンをクロックすると、親フォームは一部のオブジェクトが破棄されるという例外をスローします。
親フォームから次のようなシリアルフォームを呼び出します。
public DebugForm DebugForm;
private void button1_Click(object sender, EventArgs e)
{
if (DebugForm != null)
{
DebugForm.BringToFront();
return;
}
DebugForm = new DebugForm();
DebugForm.StartPosition = FormStartPosition.CenterScreen;
DebugForm.Closed += delegate
{
WindowState = FormWindowState.Normal;
DebugForm = null;
};
DebugForm.Show();
WindowState = FormWindowState.Minimized;
}
これが問題でしょうか?!