Winform 多线程刷新代码片段理解
1 | private void UpdateUi(Action action) |
这段 C# 代码定义了一个名为 UpdateUi
的私有方法,它接受一个 Action
类型的参数 action
。这个方法的作用是安全地在 UI 线程上执行指定的操作,通常用于 Windows Forms 应用程序中跨线程更新用户界面控件。
下面是逐行解释:
1 | private void UpdateUi(Action action) |
private
:表示该方法只能在当前类内部访问。void
:表示这个方法没有返回值。UpdateUi
:方法名。Action action
:这是一个委托参数,代表一个没有参数、没有返回值的方法。调用者可以传入一段要执行的代码(比如 lambda 表达式或方法)。
1 | if (this.IsHandleCreated) |
this.IsHandleCreated
:这是 Windows Forms 中的一个属性,用来判断当前窗体(Form)是否已经创建了底层的 Windows 句柄(即该窗体是否已经被显示过或正在显示)。- 如果句柄还没有创建(例如窗体还没显示),则不执行后续操作,防止异常。
1 | this.Invoke(action); |
this.Invoke(action)
:将传入的action
委托封送到 UI 线程去执行。这是因为 Windows Forms 控件不是线程安全的,不能直接从非 UI 线程访问或修改控件。- 使用
Invoke
可以确保即使在后台线程中调用这个方法,也能安全地切换回 UI 线程来执行 UI 操作。
示例用法
假设你在一个后台线程中想要更新一个 Label
的内容:
1 | Task.Run(() => |
在这个例子中:
FetchDataFromNetwork()
是在后台线程运行的。- 更新
label1.Text
是通过UpdateUi
方法进行的,从而避免跨线程访问异常。
总结
这段代码是一个典型的 线程安全更新 UI 的封装方法,它的作用是:
- 判断窗体是否已准备好接收 UI 操作;
- 将传入的动作封送到 UI 线程执行,确保不会出现跨线程异常。
适用于 WinForms 开发中需要从非 UI 线程安全更新界面的场景。
评论