1
2
3
4
5
6
7
8
    private void UpdateUi(Action action)
{
if (this.IsHandleCreated)
{
this.Invoke(action);
}
}
}

这段 C# 代码定义了一个名为 UpdateUi 的私有方法,它接受一个 Action 类型的参数 action。这个方法的作用是安全地在 UI 线程上执行指定的操作,通常用于 Windows Forms 应用程序中跨线程更新用户界面控件。

下面是逐行解释:

1
2
private void UpdateUi(Action action)
{
  • private:表示该方法只能在当前类内部访问。
  • void:表示这个方法没有返回值。
  • UpdateUi:方法名。
  • Action action:这是一个委托参数,代表一个没有参数、没有返回值的方法。调用者可以传入一段要执行的代码(比如 lambda 表达式或方法)。
1
2
if (this.IsHandleCreated)
{
  • this.IsHandleCreated:这是 Windows Forms 中的一个属性,用来判断当前窗体(Form)是否已经创建了底层的 Windows 句柄(即该窗体是否已经被显示过或正在显示)。
  • 如果句柄还没有创建(例如窗体还没显示),则不执行后续操作,防止异常。
1
2
3
        this.Invoke(action);
}
}
  • this.Invoke(action):将传入的 action 委托封送到 UI 线程去执行。这是因为 Windows Forms 控件不是线程安全的,不能直接从非 UI 线程访问或修改控件。
  • 使用 Invoke 可以确保即使在后台线程中调用这个方法,也能安全地切换回 UI 线程来执行 UI 操作。

示例用法

假设你在一个后台线程中想要更新一个 Label 的内容:

1
2
3
4
5
Task.Run(() =>
{
string result = FetchDataFromNetwork(); // 模拟耗时操作
UpdateUi(() => label1.Text = result); // 安全地更新 UI
});

在这个例子中:

  • FetchDataFromNetwork() 是在后台线程运行的。
  • 更新 label1.Text 是通过 UpdateUi 方法进行的,从而避免跨线程访问异常。

总结

这段代码是一个典型的 线程安全更新 UI 的封装方法,它的作用是:

  • 判断窗体是否已准备好接收 UI 操作;
  • 将传入的动作封送到 UI 线程执行,确保不会出现跨线程异常。

适用于 WinForms 开发中需要从非 UI 线程安全更新界面的场景。