クロススレッドエラーを回避:非uiスレッドからUI要素を安全に更新します
非UIスレッドのUI要素(シリアルポートデータからイベントを受信することによって生成されるスレッドなど)と相互作用する場合、スレッドの安全性の問題を処理する必要があります。
C#コードでは、「クロススレッド操作が無効です:アクセス制御「textbox1」がUIスレッドがTextBox1コントロールを所有し、アクセスしてアクセスしたためにコントロール「textbox1」を作成したスレッド以外のスレッドからのアクセス制御「textbox1」別のスレッドから、スレッドアソシエーションの競合を引き起こします。
この問題を解決するには、スケジューラを使用して、適切なスレッド(通常はUIスレッド)を許可してUI要素にアクセスする必要があります。この場合、メソッドを使用して使用して、スレッドセーフアクセスを確保できます。
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
今、serialport1_datareceivedイベントハンドラー:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
txt = serialPort1.ReadExisting().ToString();
SetText(txt.ToString());
}
Settextメソッドを使用して、TextBox1テキスト属性をUIスレッドに更新するタスクを委任し、非UIスレッドからUI要素への安全でエラーのないアクセスを確保できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3