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日

相关文章

  • 详解log4net的使用

    详解log4net的使用 log4net 是一种流行的 .NET 平台的日志记录框架,它可以记录各种级别的日志消息,并支持多种输出方式。本文将为你介绍如何在你的 .NET 项目中使用 log4net,实现灵活的日志记录功能。 安装log4net log4net 可以通过 NuGet 包管理器安装,只需要在 Visual Studio 中打开 “NuGet 包…

    C# 2023年5月31日
    00
  • C#表达式树Expression基础讲解

    我来详细讲解一下“C#表达式树Expression基础讲解”的完整攻略。 C#表达式树Expression基础讲解 什么是表达式树 表达式树是C#中的一种数据结构,用于表示一个表达式。表达式树实质上是编译器为了构建LINQ查询而特意设计的,而LINQ查询是基于C#语言表达式进行构造的。表达式树表示了代码中的表达式结构,即可以用树形结构表示出来。 表达式树应用…

    C# 2023年6月1日
    00
  • C#使用TcpListener及TcpClient开发一个简单的Chat工具实例

    C#使用TcpListener及TcpClient开发一个简单的Chat工具实例是一个比较常见的网络编程应用场景。下面我将提供一个完整的攻略,指导如何实现该工具。 1. 需求分析 首先,我们需要明确Chat工具的需求。我们需要基于TCP协议实现一个聊天工具,并保持服务器端和客户端之间的连接。服务器需要接收客户端的消息,并将消息广播给所有连接。客户端需要能够连…

    C# 2023年6月1日
    00
  • C#使用LINQ查询操作符实例代码(二)

    首先我们来了解一下这篇文章的大致内容: 本文主要介绍了 C# 使用 LINQ 查询操作符的实例代码,主要包括查询操作符的基础知识、查询语法和方法语法、Lambda表达式等内容。 下面,我们来逐步分析一下这篇文章涉及到的各部分内容。 1. 查询操作符的基础知识 这部分主要介绍了什么是查询操作符,它们的基本结构和分类等。这些基础知识为后续的操作奠定了基础。例如:…

    C# 2023年5月31日
    00
  • C#中感叹号(!) 的作用总结

    当在C#中提及感叹号(!)时,通常指的是逻辑非运算符。这个运算符常用于实现反转布尔值。 逻辑非运算符返回一个布尔值(true或false)。如果操作数为true,则该运算符返回false;如果操作数为false,则该运算符返回true。 在C#中,逻辑非运算符主要有以下两种应用: 运用于空引用类型,表示判定该对象是否为空 在C#中,操作符!被用来判断对象是否…

    C# 2023年6月6日
    00
  • C#正则表达式(Regex类)用法实例总结

    针对“C#正则表达式(Regex类)用法实例总结”,我整理了以下的完整攻略: 1. 正则表达式(Regex)的概念 正则表达式,也称为 regex(常量),指的是一种编写模式的字符序列,这个模式用于匹配一个或多个文本字符串。 Regex 类是 .NET Framework 提供的正则表达式处理类,可以通过该类来实现在一个字符串中搜索、替换和验证操作的功能。 …

    C# 2023年6月7日
    00
  • php5 apache 2.2 webservice 创建与配置(java)

    PHP5Apache2.2Webservice是一个用于搭建PHP Web服务的工具。本文将为您提供使用PHP5Apache2.2Webservice创建和配置Web服务的完整攻略。 步骤1:安装PHP5Apache2.2Webservice环境 首先需要准备好服务器,确保服务器上已经安装了Apache、PHP和MySQL。然后可以从此处下载并安装PHP5A…

    C# 2023年5月15日
    00
  • .Net常见问题之C#中的委托

    关于”.Net常见问题之C#中的委托”,我将从概念、使用和示例方面进行详细讲解。 概念 C#中的委托是指一个函数指针,它允许开发者将方法作为参数进行传递。委托可以用于事件处理、回调函数以及多线程编程。 委托是一个类型,它定义了一个函数签名(包括返回值类型、参数列表和参数类型)。委托类型的对象可包装对那些具有相同返回类型和参数类型的方法的引用。 使用 使用委托…

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