2024年4月4日发(作者:)

多线程

进度条

C# .net

前言

在我们应用程序开发过程中,经常会遇到一些问题,需要使用多线程技术来加以解决。

本文就是通过几个示例程序给大家讲解一下多线程相关的一些主要问题。

执行长任务操作

许多种类的应用程序都需要长时间操作,比如:执行一个打印任务,请求一个 Web

Service 调用等。用户在这种情况下一般会去转移做其他事情来等待任务的完成,同时还希

望随时可以监控任务的执行进度。

?/P>

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

// 显示进度条

void ShowProgress( int totalStep, int currentStep )

{

_m = totalStep;

_ = currentStep;

}

// 执行任务

void RunTask( int seconds )

{

// 每 1 / 4 秒 显示进度一次

for( int i = 0; i < seconds * 4; i++ )

{

( 250 );

// 显示进度条

ShowProgress( seconds * 4, i + 1 );

}

}

private void _btnRun_Click( object sender, rgs e )

{

RunTask( 32( _ ) );

}

当我们运行上面的程序,在整个长任务的过程中,没有出现任何问题。这样就真的没有

问题了吗?当我们切换应用程序去做其他事情后再切换回来,问题就发生了!主窗体就会出

现如下情况:

这个问题当然会发生,因为我们现在的应用程序是单线程的,因此,当线程执行长任务

时,它同时也就不能重画用户界面了。

为什么在我们切换应用程序后,问题才发生呢?这是因为当你切换当前应用程序到后台

再切换回前台时,我们需要重画整个用户界面。但是应用程序正在执行长任务,根本没有时

间处理用户界面的重画,问题就会发生。

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

们需要另外一个线程。

线程异步操作

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

private void _btnRun_Click( object sender, rgs e )

{

RunTask( 32( _ ) );

}

回想上面刚才问题发生的原因,直到 RunTask 执行完成后返回,Click 处理函数始终

不能够返回,这就意味着用户界面不能处理重画事件或其他任何事件。一个解决方法就是创

建另外一个线程,代码片断如下:

using ing;

private int _seconds;

// 执行任务工作线程进入点

void RunTaskThreadStart()

{

RunTask( _seconds );

}

// 通过创建工作线程消除用户界面线程的阻塞问题

private void _btnRun_Click( object sender, rgs e )

{

_seconds = 32( _ );

Thread runTaskThread = new Thread( new ThreadStart( RunTaskThreadStart ) );