WinForms中后台执行耗时的操作

在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。
解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。
新建线程可以用 Thread 类,可以实现多线程同时操作,简单的可以通过 BackgroundWorker 类实现。

用 BackgroundWorker 类执行耗时的操作
BackgroundWorker 类在 System.ComponentModel 命名空间下。
VS 的工具箱时有一个 BackgroundWorker 组件,就是这个类。


常用方法

1.RunWorkerAsync
开始执行后台操作。引发 DoWork 事件

2.CancelAsync
请求取消挂起的后台操作。
注意:这个方法是将 CancellationPending 属性设置为 true,并不会终止后台操作。在后台操作中要检查 CancellationPending 属性,来决定是否要继续执行耗时的操作。

3.ReportProgress
引发 ProgressChanged 事件。


常用属性

1.CancellationPending
指示应用程序是否已请求取消后台操作。
只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true。

2.WorkerSupportsCancellation
指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。

3.WorkerReportsProgress
指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。


常用事件
1.DoWork
调用 RunWorkerAsync 方法时发生。 

2.RunWorkerCompleted
后台操作已完成、被取消或引发异常时发生。

3.ProgressChanged
调用 ReportProgress 方法时发生。



例子

private BackgroundWorker backgroundWorker = new BackgroundWorker();

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.WorkerSupportsCancellation = true;

    // 绑定执行的后台操作
    backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
    
    // 绑定后台操作完成后执行的方法
    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
    
    // 控制进度的方法
    backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);

    // 引发 DoWork 事件,这时就是在线程中执行 backgroundWorker_DoWork 方法
    backgroundWorker.RunWorkerAsync();

    button1.Enabled = false;
}

private void button2_Click(object sender, EventArgs e)
{
    backgroundWorker.CancelAsync(); // 请求取消挂起的后台操作
}

// 这里不可以访问用户界面上的控件
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    System.Threading.Thread.Sleep(5000);

    // 报告进度,引发 ProgressChanged 事件
    backgroundWorker.ReportProgress(50); // 这里完成了50%

    if (!backgroundWorker.CancellationPending) // 判断用户是否执行了 CancelAsync 方法
    {
        System.Threading.Thread.Sleep(5000);
    }
    else
    {
        MessageBox.Show("中止了。");
    }
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // 这里可以访问用户界面上的控件
    button1.Enabled = true;
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // 一般通过 ProgressBar 类来显示进度
    MessageBox.Show(e.ProgressPercentage.ToString());

    // e.ProgressPercentage、e.UserState
}



在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
如果想在 DoWork 事件处理程序中和用户界面的控件通信,可在用 ReportProgress 方法。
ReportProgress(int percentProgress, object userState),可以传递一个对象。
ProgressChanged 事件可以从参数 ProgressChangedEventArgs 类的 UserState 属性得到这个信息对象。

简单的程序用 BackgroundWorker 比 Thread 方便,Thread 中和用户界面上的控件通信比较麻烦,需要用委托来调用控件的 Invoke 或 BeginInvoke 方法,没有 BackgroundWorker 方便。

http://www.huanghengxu.com/Html/Article/57.htm

转载于:https://www.cnblogs.com/qb371/archive/2011/11/28/2366290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# .NET WinForms是什么? .NET WinForms是一种用于开发Windows桌面应用程序的技术框架。它是微软公司推出的一种基于.NET平台的用户界面开发工具包。通过使用WinForms,开发人员可以创建具有图形用户界面(GUI)的各种功能强大的Windows应用程序,例如桌面应用程序、工具、实用程序和游戏等。 # .NET WinForms的特点和优势 1. 简单易学:WinForms使用C#或VB.NET等编程语言,具有直观的可视化设计工具,使开发人员能够快速创建和布局用户界面。 2. 高度可定制化:开发人员可以使用WinForms控件库的各种控件和组件,通过属性、方法和事件来自定义应用程序的行为和外观。 3. 丰富的控件库:WinForms提供了丰富的控件库,包括按钮、文本框、列表框、下拉框、树状控件、网格控件等,以满足各种应用程序的需求。 4. 跨平台兼容性:WinForms应用程序可以在Windows操作系统的各个版本上运行,并且与不同版本的.NET Framework兼容。 5. 强大的事件模型:WinForms提供了丰富的事件模型,使开发人员能够通过事件处理程序来响应用户的操作,实现交互式的应用程序。 6. 支持数据绑定:WinForms支持数据绑定,可以将数据源与用户界面控件进行绑定,实现数据的显示和操作。 7. 提供安全性和稳定性:WinForms应用程序是在.NET运行时环境执行的,具有较高的安全性和稳定性。 # .NET WinForms的应用领域 .NET WinForms广泛应用于各种领域,如企业管理系统、客户关系管理工具、图像处理工具、游戏开发等。它提供了快速开发、易维护和稳定的解决方案,使开发人员能够以较低的成本创建功能强大的桌面应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值