System.InvalidOperationException: '視窗控制代碼建立後才能呼叫控制項上的 Invoke 或 BeginInvoke
时间: 2024-04-14 17:25:43 浏览: 396
invoke和beginInvoke
这个异常通常是因为在非UI线程上尝试更新UI控件的值而导致的。在 WinForms 中,UI控件只能在创建它们的UI线程上访问和更新。
要解决这个问题,你可以使用 Control.Invoke 或 Control.BeginInvoke 方法来在UI线程上执行更新操作。以下是一个示例代码,展示了如何使用 Invoke 方法来解决这个问题:
```csharp
using System;
using System.Threading;
using System.Windows.Forms;
public class Program
{
private static ProgressBar progressBar;
public static void Main()
{
Form form = new Form();
progressBar = new ProgressBar();
form.Controls.Add(progressBar);
// 创建一个线程来模拟任务的进度更新
Thread thread = new Thread(UpdateProgress);
thread.Start();
// 显示窗体
Application.Run(form);
}
private static void UpdateProgress()
{
for (int i = 0; i <= 100; i++)
{
// 在 UI 线程中更新进度条的值
progressBar.Invoke(new Action(() => progressBar.Value = i));
// 模拟任务的延迟
Thread.Sleep(100);
}
}
}
```
在上述代码中,我们使用了 Invoke 方法来确保在 UI 线程上更新进度条的值。这样可以避免 InvalidOperationException 异常。
注意,如果你不需要等待UI线程完成操作并返回结果,你也可以使用 Control.BeginInvoke 方法。它与 Invoke 方法类似,但是它是异步执行的,不会阻塞当前线程。
通过使用 Invoke 或 BeginInvoke 方法,你可以确保在正确的线程上更新UI控件的值,并避免出现 InvalidOperationException 异常。
阅读全文