C#多线程与UI响应 防界面假死

本文介绍了在C#中如何使用多线程处理后台任务,以防止界面假死。重点讨论了BackgroundWorker组件在批量上传等场景的应用,以及如何在耗时任务中更新UI。同时,文章提到了Invoke和BeginInvoke的使用,以及Application.DoEvents在UI响应中的作用。
摘要由CSDN通过智能技术生成

一.
概述
在使用C#进行应用 程序 设计 时,经常会采用多线程 的方式进行一些后台 任务的工作。对于不同的应用场景,使用的策略也不尽相同。
1.
后台循环 任务,少量UI更新:例如批量 上传文件 ,并提供进度。这种情况使用BackgroundWorker组件 是非常好的选择。
2.
耗时的后台任务:这里的耗时任务是指一个时间较长的任务,并且不能精确获取 进度,如:调用一个远程WebService接口 。这种情况可以开两个线程,一个工作,一个更新UI(不能提供进度,只能显示动画表示系统 在运行中)。
3.
耗时的UI任务:当工作压力集中在UI响应上时,可以在工作者线程中增加延时,从而让UI线程获得响应时间。整个工作的总体时间会增加,但用户响应效果会好很多。

二.
后台的循环任务,少量UI更新
这种情况使用BackgroundWorker组件是最好的选择。(详见附一)

三.
后台耗时任务
在后台执行一个不可分解的耗时任务,需要进行界面 更新,以便让客户看上去程序有所响应。这种情况下,UI线程一般也不知道工作线程何时结束,所以一般执行循环任务,当工作线程结束后,关闭UI线程就可以了。

Thread uithread = null ;


private void btnStart_Click(object sender, EventArgs e)


{


uithread = new Thread (new ThreadStart (this .UpdateProgressThread));


uithread.Start();


Thread workthread = new Thread (new ThreadStart (this .DoSomething));



workthread.Start();


}


private void DoSomething()


{


Thread .Sleep(5000);



uithread.Abort();


MessageBox .Show("work end" );


}


private void UpdateProgressThread()


{


for (int i = 0; i < 10000; i++)


{


Thread .Sleep(100);
<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值