避免 .NET UI 更新中的“跨线程操作无效”错误
在 .NET 中,尝试从与创建 UI 元素的线程不同的线程修改 UI 元素会导致可怕的“跨线程操作无效”错误。这源于一条关键规则:UI 操作必须在最初创建 UI 元素的线程上执行。
让我们用代码示例来说明:
<code class="language-csharp">System.Threading.Thread t = new System.Threading.Thread(() => { // Perform intensive operations... listView1.Items.Add(lots of items); // Error prone line! // More UI updates... }); t.Start();</code>
此代码生成一个线程来处理任务。 但是,当线程尝试更新 UI(向 listView1
添加项目)时,会发生错误,因为主 UI 线程上未发生更新。
UI 线程的安全方法
禁止从非 UI 线程直接进行 UI 操作。 这里有两个有效的解决方案:
Invoke
方法: 如果您拥有对 UI 控件的引用(如 listView1
),请使用 Invoke
方法。 此方法将操作排队以在 UI 线程上执行。
BackgroundWorker
类: BackgroundWorker
简化了异步操作。它创建一个后台线程并促进后台线程和 UI 线程之间的通信,使跨线程更新变得易于管理。
<code class="language-csharp">BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s, e) => { /* Create items here */ }; bw.RunWorkerCompleted += (s, e) => { /* Update listView1 here */ }; bw.RunWorkerAsync();</code>
Invoke
和 BackgroundWorker
都提供了处理跨线程操作的安全机制,确保 UI 更新仅发生在适当的线程上,防止出现“跨线程操作无效”错误。
以上是如何安全处理 .NET 中 UI 更新的跨线程操作?的详细内容。更多信息请关注PHP中文网其他相关文章!