WinForm七:如何在子线程安全地刷新UI界面?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1142个文字,预计阅读时间需要5分钟。
在WinForm项目中,经常遇到多线程一起工作的场景。由于UI更新通常在主线程中处理,当主线程被长时间运算占用时,UI就会因为等待而变得无响应,出现假死现象。那么就需要引入一个新机制来解决这个问题。
在WinForm项目中,很多时候会映遇上多线程一起工作的情况,因为当前UI的更新显示,是在主线程中,一但主线程被长时运算占据后,UI就会被卡信,出现假死现像。那么就需要起一个新线程做长时运算工作,把进度或数据同步回UI线程。
以一个医保上传数据为例,功能是同步药品,器械,诊疗项目,同步完后进行验证核对。
注:为了看得清晰,各个关键控件我没有重命名
定义一个list来充当步骤和需要时间。
static List<Item> list;
private void Form1_Load(object sender, EventArgs e)
{
list = new List<Item>
{
new Item{ Name="正在上传诊疗项目",Time=8 },
new Item{ Name="正在上传器材",Time=12 },
new Item{ Name="正在上传药品",Time=20 },
new Item{ Name="正在核对",Time=24 },
};
}
第一版:用Task.Run来启动一个新的线程,中的for循环是为了表示一个进度的...的切换,如果换成一个gif图标更佳,foreach循环是完成list中各项任务的。如果运行,你会发现,窗体上是空白的,18行的给messageLabel.Text不起作用。
本文共计1142个文字,预计阅读时间需要5分钟。
在WinForm项目中,经常遇到多线程一起工作的场景。由于UI更新通常在主线程中处理,当主线程被长时间运算占用时,UI就会因为等待而变得无响应,出现假死现象。那么就需要引入一个新机制来解决这个问题。
在WinForm项目中,很多时候会映遇上多线程一起工作的情况,因为当前UI的更新显示,是在主线程中,一但主线程被长时运算占据后,UI就会被卡信,出现假死现像。那么就需要起一个新线程做长时运算工作,把进度或数据同步回UI线程。
以一个医保上传数据为例,功能是同步药品,器械,诊疗项目,同步完后进行验证核对。
注:为了看得清晰,各个关键控件我没有重命名
定义一个list来充当步骤和需要时间。
static List<Item> list;
private void Form1_Load(object sender, EventArgs e)
{
list = new List<Item>
{
new Item{ Name="正在上传诊疗项目",Time=8 },
new Item{ Name="正在上传器材",Time=12 },
new Item{ Name="正在上传药品",Time=20 },
new Item{ Name="正在核对",Time=24 },
};
}
第一版:用Task.Run来启动一个新的线程,中的for循环是为了表示一个进度的...的切换,如果换成一个gif图标更佳,foreach循环是完成list中各项任务的。如果运行,你会发现,窗体上是空白的,18行的给messageLabel.Text不起作用。

