WinForm中BackgroundWorker控件用法简单实例

下面我将为您详细讲解 “WinForm中BackgroundWorker控件用法简单实例”的攻略。

背景介绍

BackgroundWorker 控件是一个可将耗时操作异步在后台运行的控件,它是一个轻量级的多线程组件,采用消息机制处理异步耗时操作完成后的回调。使用 BackgroundWorker 可以避免 UI 界面假死或者卡顿的情况,提升程序的用户体验。

示例说明

示例1:使用 BackgroundWorker 控件实现后台计算

我们先设计一个 WinForm 界面,包含一个 TextBox 用于输入数字,一个 Button 用于触发计算,一个 Label 用于显示运算结果:

private void btnCalculate_Click(object sender, EventArgs e)
{
    if (int.TryParse(txtInput.Text, out int input))
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += Worker_DoWork;
        worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
        worker.RunWorkerAsync(input);
    }
    else
    {
        lblResult.Text = "请输入正确的数字";
        lblResult.ForeColor = Color.Red;
    }
}

private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    int input = (int)e.Argument;
    int result = Calculate(input); //计算函数
    e.Result = result;
}

private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    int result = (int)e.Result;
    lblResult.Text = result.ToString();
    lblResult.ForeColor = Color.Green;
}

private int Calculate(int input)
{
    //模拟一个计算任务
    Thread.Sleep(3000);
    return input * input;
}

在按钮点击事件中,通过 BackgroundWorker 控件实例化一个后台线程,然后分别为它的 DoWorkRunWorkerCompleted 事件指定响应函数。在 DoWork 事件中,我们将计算函数 Calculate 在后台线程中执行,并将计算结果存储在 e.Result 中。在 RunWorkerCompleted 事件中,我们拿到计算结果,并在 Label 控件中将结果显示出来。

示例2:使用 BackgroundWorker 控件更新 ProgressBar 控件

我们继续在上面的界面中加入一个 ProgressBar 控件,用于表示计算任务的进度,同时修改 Calculate 函数,采用模拟任务进度的方式,每隔 0.5 秒更新一次进度。

private void btnCalculate_Click(object sender, EventArgs e)
{
    if (int.TryParse(txtInput.Text, out int input))
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true; //开启进度报告
        worker.DoWork += Worker_DoWork1;
        worker.ProgressChanged += Worker_ProgressChanged1; //处理进度变化事件
        worker.RunWorkerCompleted += Worker_RunWorkerCompleted1;
        worker.RunWorkerAsync(input);
    }
    else
    {
        lblResult.Text = "请输入正确的数字";
        lblResult.ForeColor = Color.Red;
    }
}

private void Worker_DoWork1(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    int input = (int)e.Argument;
    int result = 0;
    for (int i = 1; i <= input; i++)
    {
        result += i;
        Thread.Sleep(500);
        worker.ReportProgress(i * 100 / input); //触发进度变化事件
    }

    e.Result = result;
}

private void Worker_ProgressChanged1(object sender, ProgressChangedEventArgs e)
{
    pbProgress.Value = e.ProgressPercentage; //更新进度条
}

private void Worker_RunWorkerCompleted1(object sender, RunWorkerCompletedEventArgs e)
{
    int result = (int)e.Result;
    lblResult.Text = result.ToString();
    lblResult.ForeColor = Color.Green;
}

在这个示例中,我们在 BackgroundWorker 控件创建时开启进度报告,然后在 DoWork 事件中对 Calculate 函数进行一个简单的修改:每隔 0.5 秒即可更新一次进度。在 DoWork 事件中,我们调用 ReportProgress 方法来触发进度变化事件,将当前的进度百分比传递进去,然后在 ProgressChanged 事件中更新 ProgressBar 控件的值即可。

总结

以上就是 WinFormBackgroundWorker 控件的一个简单使用攻略。BackgroundWorker 控件的强大之处在于它可以很方便地完成多线程编程,使得我们能够更好地提升程序的性能和用户体验,同时它的使用也极为简单,只需要几个事件和方法即可完成一个异步操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WinForm中BackgroundWorker控件用法简单实例 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • .NET Core项目使用swagger开发组件

    .NET Core项目使用Swagger开发组件 Swagger是一种用于描述RESTful Web服务的标准格式,它可以帮助我们生成API文档和客户端代码。在.NET Core项目中,我们可以使用Swagger来开发组件。本攻略将详细介绍如何在.NET Core项目中使用Swagger开发组件。 环境要求 在进行.NET Core项目使用Swagger开发…

    C# 2023年5月17日
    00
  • 解读ASP.NET 5 & MVC6系列教程(13):TagHelper

    解读ASP.NET 5 & MVC6系列教程(13):TagHelper 在 ASP.NET 5 & MVC6 中,TagHelper 是一种新的技术,它可以帮助我们更方便地生成 HTML 标记。本攻略将介绍如何使用 TagHelper。 步骤 步骤1:创建一个新的 ASP.NET 5 & MVC6 项目 首先,我们需要创建一个新的 …

    C# 2023年5月17日
    00
  • C#下实现创建和删除目录的实例代码

    下面是详细的攻略。 1.创建目录 C#语言提供了Directory类用于操作目录。在进行目录创建前,需要确保创建目录的上层目录存在。 代码示例一 下面展示一个简单的示例,以创建名为newFolder的目录为例: using System.IO; class Program { static void Main(string[] args) { string …

    C# 2023年6月6日
    00
  • C# BinaryWriter.Close – 关闭二进制编写器

    BinaryWriter.Close 方法是 C# 中 FileStream 的辅助写入器,用于在写入完毕后关闭流并释放资源。本文将详细讲解 BinaryWriter.Close 方法的作用及用法。 方法作用 BinaryWriter.Close 方法的作用是关闭该写入器所关联的 FileStream 并释放资源,避免流的泄漏。 方法语法 BinaryWri…

    C# 2023年4月19日
    00
  • C#中使用DataContractSerializer类实现深拷贝操作示例

    下面是关于“C#中使用DataContractSerializer类实现深拷贝操作示例”的完整攻略: 1. 什么是深拷贝? 深拷贝和浅拷贝是常用的两种对象复制方式。 浅拷贝指的是对于某个对象,只复制其基本类型数据(比如int、float、string等),而将其引用类型数据(比如对象)的引用复制给新对象。 深拷贝则是对某个对象进行复制时,将其引用类型数据也一…

    C# 2023年5月31日
    00
  • Unity 如何获取鼠标停留位置下的物体

    获取鼠标停留位置下的物体,需要以下几个步骤: 根据鼠标位置获取射线 发射射线,判断射线是否碰撞到物体 如果碰撞到物体,获取物体信息 下面是具体的实现步骤: 步骤1:根据鼠标位置获取射线 在 Unity 中,可以通过 Camera 的 ScreenPointToRay 方法获取屏幕上一点的射线。 Ray ray = Camera.main.ScreenPoin…

    C# 2023年6月3日
    00
  • C# Clone():创建并返回当前集合的副本

    当我们想要在C#中复制一个对象的数据而不是仅仅是引用时,可以使用Clone()方法。Clone()方法是从基类Object继承下来的,它返回当前实例的一份副本。 下面是使用Clone()时需要注意的几点要求: 被克隆的对象需要实现ICloneable接口,因为Clone()方法实际上是对ICloneable接口的实现。 Clone()方法返回的是Object…

    C# 2023年4月19日
    00
  • C#语法相比其它语言比较独特的地方(二)

    下面我将详细讲解“C#语法相比其它语言比较独特的地方(二)”的攻略: 1. 运算符重载 在C#中,我们可以重载运算符来自定义类型之间的运算操作。这就是C#语法相比其它语言比较独特的地方之一。 例如,我们可以定义一个Rational类(代表有理数),并重载运算符以便让我们像操作整数一样操作有理数。 class Rational { public int Num…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部