首頁 > 後端開發 > C++ > 如何解決C#多執行緒中「跨執行緒操作無效」錯誤?

如何解決C#多執行緒中「跨執行緒操作無效」錯誤?

Linda Hamilton
發布: 2025-01-23 02:25:10
原創
556 人瀏覽過

How to Solve the

處理 C# 多執行緒應用程式中的「跨執行緒操作無效」例外

在使用多執行緒的 C# 應用程式中,確保 UI 元素由負責建立它們的執行緒獨佔存取至關重要。 違反這項原則會導致可怕的「跨執行緒操作無效」異常。

了解 C# 執行緒與 UI 元素擁有權

C# 允許透過多個執行緒並發執行。每個執行緒在其自己的上下文中獨立運行。 至關重要的是,UI 元素(如文字方塊)屬於特定線程,通常是主 UI 線程。

問題:從未經授權的執行緒存取 UI 元素

當擁有執行緒以外的執行緒嘗試修改 UI 元素的屬性時,會出現此錯誤。 這是一種常見的場景,在處理來自後台執行緒的事件(例如串列埠資料接收)時經常會遇到。

解:實作調度程式呼叫

解決方案涉及使用排程器將操作封送到正確的執行緒上。 這保證了 UI 控制項的線程安全修改。

程式碼實作

以下是實施此解決方案的方法:

首先,定義一個委託:

<code class="language-csharp">private delegate void SetTextCallback(string text);</code>
登入後複製

接下來,建立一個方法來安全更新文字方塊:

<code class="language-csharp">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;
    }
}</code>
登入後複製

最後,在串列埠資料接收事件處理程序中,呼叫SetText方法:

<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    txt += serialPort1.ReadExisting();
    SetText(txt);
}</code>
登入後複製

此方法可確保 textBox1.Text 屬性安全性更新,防止出現「跨執行緒操作無效」例外。 InvokeRequired 檢查有效地決定是否需要調度程序呼叫。

以上是如何解決C#多執行緒中「跨執行緒操作無效」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板