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日

相关文章

  • asp.net Repeater 数据绑定的具体实现(图文详解)

    当我们需要在ASP.NET网站中显示重复数据时,asp.net Repeater控件是一个很好的选择。Repeater可以通过绑定数据源来在网站上显示重复的数据。以下是asp.net Repeater数据绑定的具体实现攻略。 第一步:创建一个asp.net网站 首先,打开Visual Studio并创建一个新的ASP.NET网站。可以选择任何类型的ASP.N…

    C# 2023年6月3日
    00
  • 提示出现unresolved external symbol _main的解决方法

    针对提示出现unresolved externalsymbol _main的解决方法,我们可以按照以下步骤进行操作: 1. 首先确定你的程序是C++程序还是C程序 在Visual Studio中,C++程序的入口点是main函数,而C程序的入口点是wmain函数。因此,如果你的程序是C++程序,那么你的main函数需要包含正确的参数列表,如下所示: int …

    C# 2023年5月15日
    00
  • 在Winform动态启动、控制台命令行的方法

    下面是详细的讲解。 Winform动态启动 Winform动态启动是指在Winform程序运行的过程中,通过代码动态地启动其它的Winform程序。这个过程可以通过使用Process类来实现。 Process类是.NET中用于指示、启动和停止本地系统上进程的类。它提供了几种不同的方法来创建、启动和停止新的进程。其中,我们可以使用Start方法来启动一个新的进…

    C# 2023年6月7日
    00
  • 天朝教育委员会2答案攻略 哈罗公学题库完整答案详解

    天朝教育委员会2答案攻略哈罗公学题库完整答案详解 简介 天朝教育委员会2是一款非常受欢迎的手游,不少玩家都遇到了难题,其中一个问题就是如何获得哈罗公学题库的完整答案详解。本文将为大家提供详细的攻略,帮助大家解决这个难题。 攻略过程 步骤一:下载哈罗公学APP 要获得哈罗公学题库的完整答案详解,需要先下载哈罗公学APP。哈罗公学APP是一款高品质的教育类APP…

    C# 2023年5月15日
    00
  • 解析Asp.net Core中使用Session的方法

    下面我来详细讲解在Asp.net Core中使用Session的方法。 简介 在Asp.net Core中,Session是一种在服务器端存储用户数据的机制,用于存储在不同请求之间需要共享的数据。Session的使用可以帮助我们实现用户认证、用户状态管理等功能。在Asp.net Core中,使用Session存储数据需要借助Session服务。 配置Sess…

    C# 2023年5月31日
    00
  • C# System.TypeInitializationException 异常处理方案

    首先我们来简单地了解一下什么是”System.TypeInitializationException”异常。 “System.TypeInitializationException”是.NET框架中的一种异常,它通常发生在类或结构体初始化时,当初始化过程中发生错误时就会抛出该类异常。例如,在类的静态构造函数中,初始化对象时出现错误,或者在静态变量初始化期间出…

    C# 2023年5月15日
    00
  • 使用ASP.Net WebAPI构建REST服务

    下面是关于“使用ASP.Net WebAPI构建REST服务”的完整攻略,包含两个示例。 1. 什么是REST服务? REST(Representational State Transfer)是一种基于HTTP协议的软件架构风格,用于构建分布式系统。REST服务是一种使用HTTP协议提供Web服务的方式,它使用HTTP方法(GET、POST、PUT、DELE…

    C# 2023年5月15日
    00
  • 无法读取配置节 system.serviceModel 因为它缺少节声明的解决方法

    无法读取配置节system.serviceModel因为它缺少节声明的解决方法 在.NET应用程序中,system.serviceModel配置节通常用于配置WCF服务。当我们在应用程序中使用WCF服务时,有时会遇到“无法读取配置节system.serviceModel因为它缺少节声明”的错误。这个错误通常是由于缺少system.serviceModel节声…

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