时间:2021-05-20
一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能.
BackgroundWorker类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。
如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker类方便地解决问题(MSDN)。
若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建 BackgroundWorker,
也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。 如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中(MSDN)。
属性:
IsBusy:获取一个值,指示 BackgroundWorker 是否正在运行异步操作。
WorkerReportsProgress:获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。
WorkerSupportsCancellation:获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。
事件:
DoWork:调用 RunWorkerAsync 时发生。
ProgressChanged:调用 ReportProgress 时发生。
RunWorkerCompleted:当后台操作已完成、被取消或引发异常时发生。
实例:
窗体设计如下图:
代码实现:
复制代码 代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 12; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
lbResult.Text = "Canceled!";
}
else if (e.Error != null)
{
lbResult.Text = "Error: " + e.Error.Message;
}
else
{
lbResult.Text = "Done!";
}
}
private void btnStartAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
backgroundWorker1.RunWorkerAsync();
}
}
private void btnCancelAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
backgroundWorker1.CancelAsync();
}
}
}
}
运行结果:
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
c#异步操作,BackgroundWorker类的使用,可以在后台运行需要的代码逻辑。复制代码代码如下:usingSystem;usingSystem.Coll
在之前的文章中介绍了C#是一种完全面向对象的语言,既然是完全面向对象的语言就应该用面向对象的模式去学习C#,不了解面向对象?不必担心。这篇文章将介绍学习C#基础
C#数组有很多值得学习的地方,这里我们主要介绍C#交错数组,包括介绍一维数组例、二维数组例、C#交错数组等方面。数组是在我们编程当中经常用到的,想来大家对数组都
本文实例讲述了C#中Mutex对象用法。分享给大家供大家参考,具体如下:C#语言有很多值得学习的地方,这里我们就来介绍C#Mutex对象,包括介绍控制好多个线程
本文以实例形式简单介绍了C#中委托的用法,是深入学习C#程序设计所必须掌握的重要技巧。现以教程形式分享给大家供大家参考之用。具体如下:首先,委托是C#中最为常见