c# 多线程和异步委托实现进度条

本文通过示例讲解C#中如何利用多线程和异步委托处理长任务,解决用户界面更新问题。探讨了线程安全问题,提出通过委托访问窗体资源的解决方案,旨在帮助理解多线程编程和异步调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在我们应用程序开发过程中,经常会遇到一些问题,需要使用多线程技术来加以解决。本文就是通过几个示例程序给大家讲解一下多线程相关的一些主要问题。

执行长任务操作

  许多种类的应用程序都需要长时间操作,比如:执行一个打印任务,请求一个 Web Service 调用等。用户在这种情况下一般会去转移做其他事情来等待任务的完成,同时还希望随时可以监控任务的执行进度。

?/P>

  下面的代码片断示例了当长任务执行时用户界面是如何被更新的。

//  显示进度条
void  ShowProgress(  int  totalStep,  int  currentStep )
{
_Progress.Maximum 
= totalStep;
_Progress.Value 
= currentStep;
}


//  执行任务
void  RunTask(  int  seconds )
{
// 每 1 / 4 秒 显示进度一次
forint i = 0; i < seconds * 4; i++ )
{
Thread.Sleep( 
250 );

// 显示进度条
ShowProgress( seconds * 4, i + 1 );
}

}


private   void  _btnRun_Click(  object  sender, System.EventArgs e )
{
RunTask( Convert.ToInt32( _txtSecond.Value ) );
}

 


当我们运行上面的程序,在整个长任务的过程中,没有出现任何问题。这样就真的没有问题了吗?当我们切换应用程序去做其他事情后再切换回来,问题就发生了!主窗体就会出现如下情况:

  这个问题当然会发生,因为我们现在的应用程序是单线程的,因此,当线程执行长任务时,它同时也就不能重画用户界面了。

为什么在我们切换应用程序后,问题才发生呢?这是因为当你切换当前应用程序到后台再切换回前台时,我们需要重画整个用户界面。但是应用程序正在执行长任务,根本没有时间处理用户界面的重画,问题就会发生。

如何解决问题呢?我们需要将长任务放在后台运行,把用户界面线程解放出来,因此我们需要另外一个线程。

线程异步操作

  我们上面程序中执行按钮的Click 处理如下

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值