在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。
BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

程序代码:
using
System;

using
System.Collections.Generic;

using
System.ComponentModel;

using
System.Data;

using
System.Drawing;

using
System.Text;

using
System.Windows.Forms;




namespace
BackgroundWorkerDemo
{

public

partial

class
MainForm : Form
{

private
BackgroundWorker worker
=

new
BackgroundWorker();

public
MainForm()
{
InitializeComponent();
worker.WorkerReportsProgress
=

true
;
worker.WorkerSupportsCancellation
=

true
;

//
正式做事情的地方


worker.DoWork
+=
new
DoWorkEventHandler(DoWork);

//
任务完称时要做的,比如提示等等


worker.ProgressChanged
+=

new
ProgressChangedEventHandler(ProgessChanged);

//
任务进行时,报告进度


worker.RunWorkerCompleted
+=

new
RunWorkerCompletedEventHandler(CompleteWork);
}


//
调用 RunWorkerAsync 时发生



public

void
DoWork(
object
sender, DoWorkEventArgs e)
{
e.Result
=
ComputeFibonacci(worker, e);
//
当ComputeFibonacci(worker, e)返回时,异步过程结束


}

//
调用 ReportProgress 时发生



public

void
ProgessChanged(
object
sender, ProgressChangedEventArgs e)
{

this
.progressBar1.Value
=
e.ProgressPercentage;
}

//
当后台操作已完成、被取消或引发异常时发生



public

void
CompleteWork(
object
sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show(
"
完成!
"
);
}


private

int
ComputeFibonacci(
object
sender, DoWorkEventArgs e)
{

for
(
int
i
=

0
; i
<

1000
; i
++
)
{

if
(worker.CancellationPending)
{
e.Cancel
=

true
;
return -1;
}

else

{
worker.ReportProgress(i);
}
System.Threading.Thread.Sleep(
10
);
}

return

-
1
;
}


private

void
btnStart_Click(
object
sender, EventArgs e)
{
worker.RunWorkerAsync();
btnStart.Enabled
=

false
;
btnPause.Enabled
=

true
;
}


private

void
btnPause_Click(
object
sender, EventArgs e)
{
btnPause.Enabled
=

false
;
btnStart.Enabled
=

true
;
worker.CancelAsync();
}
}
}