C#中backgroundWorker类的用法详解

C#中BackgroundWorker类的用法详解

1.背景介绍

BackgroundWorker是一个简化多线程编程的组件,一般用来实现后台操作。相比于Thread类,BackgroundWorker更加易于使用,而且可以避免许多线程相关的问题。在BackgroundWorker中,通过DoWork事件处理程序处理计算任务,并把计算结果通过RunWorkerCompleted事件处理程序返回给主线程。

2.BackgroundWorker类的重要成员

2.1 DoWork

该事件在后台线程中触发,用于执行长时间运行的计算操作。

2.2 ProgressChanged

该事件在后台线程中触发,通常用于显示实时进度更新。需要调用ReportProgress方法来激发该事件。

2.3 RunWorkerCompleted

该事件在后台线程执行结束时触发,通常用于对计算结果进行处理或更新UI。

2.4 WorkerReportsProgress

该属性用于指示是否应该在进度更新时激发ProgressChanged事件。

2.5 WorkerSupportsCancellation

该属性用于指示是否支持取消异步操作。

3.使用BackgroundWorker类的示例

private BackgroundWorker worker = new BackgroundWorker();

private void btnStart_Click(object sender, EventArgs e)
{
    // 初始化BackgroundWorker组件
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

    // 开始计算
    worker.RunWorkerAsync();
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        // 模拟长时间运行的计算操作
        Thread.Sleep(100);

        // 报告进度
        if (worker.WorkerReportsProgress)
        {
            worker.ReportProgress(i + 1);
        }

        // 取消操作
        if (worker.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
    }

    // 计算完毕,返回结果
    e.Result = "计算结果";
}

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("操作已完成,结果为:" + e.Result.ToString());
    }
}

在上述示例中,当用户点击btnStart按钮时,会启动一个后台线程,执行worker_DoWork方法中的计算操作,并且在进度更新时会激发worker_ProgressChanged方法。当计算完成后,会返回计算结果,并通过worker_RunWorkerCompleted方法将结果显示在UI界面上。

3.1 示例2:取消异步操作

private BackgroundWorker worker = new BackgroundWorker();

private void btnCancel_Click(object sender, EventArgs e)
{
    worker.CancelAsync();
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        // 模拟长时间运行的计算操作
        Thread.Sleep(100);

        // 报告进度
        if (worker.WorkerReportsProgress)
        {
            worker.ReportProgress(i + 1);
        }

        // 取消操作
        if (worker.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
    }

    // 计算完毕,返回结果
    e.Result = "计算结果";
}

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("操作已完成,结果为:" + e.Result.ToString());
    }
}

在上述示例中,当用户点击btnCancel按钮时,会调用worker.CancelAsync()方法取消异步操作。在执行计算操作时,会不断检查是否需要取消操作worker.CancellationPending。当该属性值为true时,会设置DoWorkEventArgs.Canceltrue。在worker_RunWorkerCompleted中检查e.Cancelled属性来判断操作是否被取消。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中backgroundWorker类的用法详解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • c# 解决IIS写Excel的权限问题

    针对这个问题,我们需要先明确一下背景和原理。 背景 通常情况下,在我们开发 ASP.NET 程序时,会遇到需要生成 Excel 文件的情况。而在将 Excel 文件写入到服务器磁盘时,可能会面临权限不足的问题,导致写入失败。那么如何解决这个问题呢? 原理 在 IIS 中,每个应用程序池都有一个对应的身份标识,这个身份标识默认是 IIS AppPool{应用程…

    C# 2023年5月15日
    00
  • C#后台创建控件并获取值的方法

    这里是关于C#后台创建控件并获取值的完整攻略。 1. 创建控件 1.1 动态创建控件 在代码中创建控件的过程称为动态创建控件。和手动设计窗体不同,动态创建控件是在程序运行过程中才会创建。 下面是一个动态创建文本框控件和一个按钮控件的例子: // 创建一个文本框控件 var textBox = new TextBox(); textBox.Location =…

    C# 2023年6月1日
    00
  • C# GUID ToString的使用总结

    C# GUID ToString的使用总结 什么是GUID GUID (Globally Unique Identifier) 是一个128位数的二进制标识符,通常用于在各种领域标识唯一性。 在C#中,可以使用Guid结构体来表示GUID。Guid结构体包含了许多静态方法和实例方法,其中一种实例方法是ToString。 怎么使用GUID ToString方法…

    C# 2023年6月7日
    00
  • C# 创建控制台应用程序

    C#创建控制台应用程序的完整攻略 在C#中,控制台应用程序是一种常见的应用程序类型,可以在命令行中运行。本文将提供一个完整的C#创建控制台应用程序的攻略,包括创建、编译、运行、调试等操作。 步骤1:创建控制台应用程序 要创建控制台应用程序,可以按照以下步骤操作: 打开Visual Studio。 选择“文件”->“新建”->“项目”。 在“新建项…

    C# 2023年5月15日
    00
  • C#中如何执行存储过程方法

    要在C#中执行存储过程方法,需要以下步骤: 1. 创建SqlConnection对象 首先需要设置连接字符串并创建一个SqlConnection对象。连接字符串可以指定连接服务器的地址、数据库名称、用户名、密码等信息。 string connectionString = "Server=myServerAddress;Database=myData…

    C# 2023年5月31日
    00
  • c# 实现简单的串口通讯

    下面是详细讲解“c#实现简单的串口通讯”的完整攻略。 硬件准备 在进行串口通讯前,我们需要准备一些硬件设备,包括: 确保计算机中带有串口或者USB转串口的转接器。 一根串口线。 串口通讯设备(例如:单片机)。 环境配置 在进行串口通讯前,需要在电脑上安装串口通讯库,使用.NET的串口类即可实现串口通讯。在Visual Studio中,可以在工具箱中找到串口控…

    C# 2023年5月15日
    00
  • .Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API

    .Net6集成IdentityServer4 +AspNetCore Identity读取数据表用户且鉴权授权管理API IdentityServer4是一个开源的身份验证和授权框架,它可以帮助我们轻松地实现单点登录和API访问控制。AspNetCore Identity是一个用于管理用户和角色的框架,它可以与IdentityServer4集成,实现用户身份…

    C# 2023年5月17日
    00
  • C# 中的 is 真的是越来越强大越来越语义化(推荐)

    当我们在编写代码时需要进行类型判断,比如判断一个对象是否属于某个类或者接口。此时,在C#中我们可以使用 is 运算符来进行类型检查。而在最新的 C# 9 中,is 运算符得到了升级,变得更加易用,语义化更加强大。 is 运算符的基本用法 is 运算符用于类型检查,返回一个布尔值。它的基本语法如下: if (obj is MyClass) { // 对 obj…

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