winform多线程组件BackgroundWorker使用

WinForm多线程组件BackgroundWorker是一种方便且易于使用的组件,可以使多线程编程变得更加容易。以下是使用BackgroundWorker时需要注意的事项:

什么是BackgroundWorker

BackgroundWorker是一个WinForm多线程组件,可以在后台执行操作,通常可以将花费时间很长的任务放在后台线程中执行,而不会阻塞UI线程。 BackgroundWorker组件提供了三个事件:DoWork、ProgressChanged和RunWorkerCompleted。当你在后台执行操作时,可以将进度信息报告给UI线程,并在运行结束时调用RunWorkerCompleted事件。

创建BackgroundWorker

在设计模式下,你可以从工具菜单中选择BackgroundWorker组件并将其拖拽到WinForm窗体中。然后,通过检查属性窗口上的worker属性来设置背景工作器的属性,例如:WorkerReportsProgress属性(指示是否应在进度更改时通知UI线程)和WorkerSupportsCancellation属性(指示背景工作器是否支持取消操作)。或者,你可以在代码中直接创建BackgroundWorker实例,例如:

private BackgroundWorker _worker = new BackgroundWorker();

启动BackgroundWorker

要启动BackgroundWorker,你可以通过调用RunWorkerAsync方法,例如:

_worker.RunWorkerAsync();

你可以选择将StartNewWorker方法绑定到按钮的Click事件上,例如:

private void btnStartWorker_Click(object sender, EventArgs e)
{
    _worker.RunWorkerAsync();
}

实现DoWork事件

DoWork事件是BackgroundWorker中最重要的事件,必须在该事件中编写实际要执行的代码。该事件会在后台线程上执行,因此不能直接从DoWork事件访问UI元素。如果需要更新进度,可以调用ReportProgress方法,向UI线程报告进度,例如:

private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        Thread.Sleep(100);
        _worker.ReportProgress(i);
    }
}

更新UI元素

如果需要在DoWork事件中更新UI元素,可以将ReportProgress方法的UserState属性设置为要发送给UI线程的对象。通过ReportProgress方法发送对象到UI线程,可以在ProgressChanged事件中读取该对象并更新UI元素,例如:

private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    lblPercentComplete.Text = e.ProgressPercentage.ToString() + "%";
    progressBar.Value = e.ProgressPercentage;
    if (e.UserState != null)
    {
        string message = (string)e.UserState;
        MessageBox.Show(message);
    }
}

实现RunWorkerCompleted事件

在DoWork事件完成后,RunWorkerCompleted事件将被引发。在该事件中,您可以执行任何喜欢的操作,并在需要时检查错误并从异常中提取错误消息。例如:

private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        MessageBox.Show("任务已取消。");
    }
    else if (e.Error != null)
    {
        MessageBox.Show("错误:" + e.Error.Message);
    }
    else
    {
        MessageBox.Show("任务已完成。");
    }
}

示例1:简单的后台操作

在此示例中,我们将会显示一个包含一个按钮和一个进度条的窗体。单击按钮将在后台线程上执行任务,并在进度条上报告进度。当任务完成时,我们将在UI线程上显示消息。

private void btnStartWorker_Click(object sender, EventArgs e)
{
    _worker.WorkerReportsProgress = true;
    _worker.WorkerSupportsCancellation = true;
    _worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
    _worker.ProgressChanged += new ProgressChangedEventHandler(_worker_ProgressChanged);
    _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
    _worker.RunWorkerAsync();
}

private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        Thread.Sleep(100);
        _worker.ReportProgress(i);
    }
    e.Result = "任务已完成";
}

private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
    lblPercentComplete.Text = e.ProgressPercentage.ToString() + "%";
}

private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        MessageBox.Show("任务已取消");
    }
    else if (e.Error != null)
    {
        MessageBox.Show("错误:" + e.Error.Message);
    }
    else
    {
        string result = (string)e.Result;
        MessageBox.Show(result);
    }
}

示例2:取消后台操作

此示例演示了如何取消后台操作。当用户单击“取消”按钮时,将取消后台任务。当任务被取消时,我们将在UI线程上显示消息。

private void btnStartWorker_Click(object sender, EventArgs e)
{
    _worker.WorkerReportsProgress = true;
    _worker.WorkerSupportsCancellation = true;
    _worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
    _worker.ProgressChanged += new ProgressChangedEventHandler(_worker_ProgressChanged);
    _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
    _worker.RunWorkerAsync();
}

private void btnCancel_Click(object sender, EventArgs e)
{
    if (_worker.IsBusy)
    {
        _worker.CancelAsync();
    }
}

private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        if (_worker.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
        Thread.Sleep(100);
        _worker.ReportProgress(i);
    }
    e.Result = "任务已完成";
}

private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
    lblPercentComplete.Text = e.ProgressPercentage.ToString() + "%";
}

private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        MessageBox.Show("任务已取消");
    }
    else if (e.Error != null)
    {
        MessageBox.Show("错误:" + e.Error.Message);
    }
    else
    {
        string result = (string)e.Result;
        MessageBox.Show(result);
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:winform多线程组件BackgroundWorker使用 - Python技术站

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

相关文章

  • 在C#中global关键字的作用及其用法

    在C#中global关键字的作用及其用法 在C#中,global关键字可以用来指示某个标识符是全局的,从而可以在任何地方都可以访问到。 用法一:全局命名空间 在C#中,全局命名空间是由所有不属于其他命名空间的类型、函数和变量组成的空间。可以使用global关键字来引用全局命名空间中的类型或变量,例如: global::System.Console.Write…

    C# 2023年5月15日
    00
  • WPF如何自定义ProgressBar滚动条样式

    下面是” WPF如何自定义ProgressBar滚动条样式”的完整攻略。 1. 了解ProgressBar控件 在WPF中,ProgressBar控件常用于展示进度条,可以在控件中设置Value属性来表示进度的大小。而滚动条的显示效果是ProgressBar样式的一种形式,因此,我们可以通过自定义ProgressBar的样式来实现滚动条的效果。 2. 新建自…

    C# 2023年6月6日
    00
  • ASP.NET Internet安全Forms身份验证方法

    ASP.NET Internet安全Forms身份验证方法 ASP.NET Internet安全Forms身份验证方法是一种用于保护ASP.NET Web应用程序的身份验证方法。本文将提供详细的“ASP.NET Internet安全Forms身份验证方法”的完整攻略,包括如何配置Web.config文件、如何使用Forms身份验证方法以及两个示例。 配置We…

    C# 2023年5月15日
    00
  • C# 设计模式系列教程-策略模式

    首先我们来介绍一下“C# 设计模式系列教程-策略模式”的概念。 策略模式 策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。通过定义多个算法类实现同一个接口,并且可以随时切换算法,使得客户端程序能够根据不同的情况选择不同的算法。 策略模式的角色 策略模式涉及到三个角色: 上下文(Context):拥有多个算法类对象,维护一个对于策略对象的引用,可以…

    C# 2023年6月6日
    00
  • C#基础入门之算法:交换

    C#基础入门之算法:交换 算法介绍 交换是一种常用的算法,它可以将两个变量的值互换。在编程中,交换算法经常用于排序、查找、加密等操作中。 实现方法 在C#中,实现变量交换可以采用以下四种方法: 1.使用第三个变量 int a = 3; int b = 5; int temp = a; a = b; b = temp; 2.使用加减法 int a = 3; i…

    C# 2023年6月6日
    00
  • .NET Core控制台应用ConsoleApp读取appsettings.json配置文件

    .NET Core控制台应用ConsoleApp读取appsettings.json配置文件 在.NET Core控制台应用程序中,读取appsettings.json配置文件是一项非常重要的任务,它可以帮助您管理应用程序的配置信息。在本攻略中,我们将详细讲解如何读取appsettings.json配置文件,并提供两个示例说明。 步骤一:添加Microsof…

    C# 2023年5月17日
    00
  • C#实现拼图游戏

    C#实现拼图游戏攻略 简介 拼图游戏是一种常见的益智休闲游戏,游戏的目标是通过调换图块的位置,将一张被分割成若干小块的图片恢复原样。在本攻略中,我们将使用C#语言实现一个简单的拼图游戏。 实现步骤 第一步:准备工作 在开始实现之前,需要准备以下工作: 下载安装Visual Studio开发环境。 下载准备好的游戏所需的图片资源。 第二步:创建项目并导入资源 …

    C# 2023年6月1日
    00
  • C#实现将一个字符串进行翻转显示的6种方法

    下面给出C#实现将一个字符串进行翻转显示的6种方法的完整攻略。 步骤1:分析题目要求 题目要求将一个字符串进行翻转显示,该字符串可以包含中英文、数字、标点符号,我们需要使用C#实现该功能,并提供6种实现方法。 步骤2:C#实现翻转字符串 方法1:使用Array.Reverse()方法 我们可以使用C#的Array.Reverse()方法来实现字符串翻转。该方…

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