C#中backgroundworker的使用教程

yizhihongxing

下面是“C#中BackgroundWorker的使用教程”的完整攻略。

背景

BackgroundWorker是C#中常用于执行后台任务的组件,它可以执行不会阻塞UI线程的耗时操作,并在操作完成后返回结果。这个组件非常适合处理长时间运行的操作,例如读取、写入文件或进行网络通信等。

BackgroundWorker的基本用法

实例化BackgroundWorker组件

首先,需要在代码中实例化BackgroundWorker组件。在Visual Studio中,可以通过拖放控件或直接在代码中实例化组件。下面是在代码中实例化的示例代码:

using System.ComponentModel; 

namespace MyApplication
{
    public partial class MainForm : Form
    {
        private BackgroundWorker worker;

        public MainForm()
        {
            InitializeComponent();
            worker = new BackgroundWorker();
        }
    }
}

可以看出,在MainForm的构造函数中创建了一个BackgroundWorker实例并将其存储在worker变量中。

设置BackgroundWorker的属性

BackgroundWorker实例创建后,需要设置其属性,以便该组件能够执行后台操作并返回结果。

下面是一些常用的属性:

  • WorkerReportsProgress:指示BackgroundWorker是否支持报告进度。
  • WorkerSupportsCancellation:指示BackgroundWorker是否支持取消操作。
  • DoWork:定义BackgroundWorker需要执行的操作。
  • ProgressChanged:定义进度更新时触发的事件。
  • RunWorkerCompleted:定义操作完成时触发的事件。

在Visual Studio中,可以通过组件属性窗口或代码中调用属性设置来设置这些属性。下面是一个代码段,设置了BackgroundWorker的这些属性:

public MainForm()
{
    InitializeComponent();
    worker = new BackgroundWorker();
    worker.WorkerReportsProgress = true;
    worker.WorkerSupportsCancellation = true;
    worker.DoWork += new DoWorkEventHandler(DoWorkHandler);
    worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChangedHandler);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedHandler);
}

这个示例代码中设置了上述所有属性,并将它们分别绑定到处理函数中。

执行BackgroundWorker

在设置好BackgroundWorker的属性之后,可以通过调用BackgroundWorker.RunWorkerAsync()方法来执行后台操作。下面是具体实现:

private void StartButton_Click(object sender, EventArgs e)
{
    if (!worker.IsBusy)
    {
        worker.RunWorkerAsync();
    }
}

在StartButton按钮的单击事件处理程序中,调用BackgroundWorker.RunWorkerAsync()方法来启动后台操作。可以通过检查BackgroundWorker.IsBusy属性来判断后台操作是否正在运行。

处理BackgroundWorker的结果

BackgroundWorker完成操作时,将引发RunWorkerCompleted事件。可以在事件处理程序中处理操作的结果。以下是一个示例:

private void CompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show($"Error occurred: {e.Error.Message}");
    }
    else if (e.Cancelled)
    {
        MessageBox.Show("Operation cancelled.");
    }
    else
    {
        MessageBox.Show("Operation completed successfully.");
    }
}

CompletedHandler事件处理程序中,检查RunWorkerCompletedEventArgs参数中的ErrorCancelled属性,以确定操作是否完成,并处理结果。

示例1:执行计算任务

下面是一个简单的示例,演示如何使用BackgroundWorker执行计算任务,并报告进度和处理结果。

using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace MyApplication
{
    public partial class MainForm : Form
    {
        private BackgroundWorker worker;

        public MainForm()
        {
            InitializeComponent();
            worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
            worker.WorkerSupportsCancellation = true;
            worker.DoWork += new DoWorkEventHandler(DoWorkHandler);
            worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChangedHandler);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedHandler);
        }

        private void DoWorkHandler(object sender, DoWorkEventArgs e)
        {
            int num = (int)e.Argument;
            int result = 0;
            for (int i = 1; i <= num; i++)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
                result += i;
                int progress = (i * 100) / num;
                worker.ReportProgress(progress);
                Thread.Sleep(100);
            }
            e.Result = result;
        }

        private void ProgressChangedHandler(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProgressPercentage;
        }

        private void CompletedHandler(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show($"Error occurred: {e.Error.Message}");
            }
            else if (e.Cancelled)
            {
                MessageBox.Show("Operation cancelled.");
            }
            else
            {
                int result = (int)e.Result;
                resultLabel.Text = result.ToString();
            }
            startButton.Enabled = true;
        }

        private void StartButton_Click(object sender, EventArgs e)
        {
            if (!worker.IsBusy)
            {
                int num = (int)numUpDown.Value;
                startButton.Enabled = false;
                worker.RunWorkerAsync(num);
            }
        }

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

上述代码创建一个窗体,在窗体中有一个数字输入框、一个进度条、一个计算按钮和一个取消按钮。当用户点击计算按钮时,将在后台线程中计算1到输入数字之间的所有数字之和,并报告进度。当计算完成时,将在UI线程上更新结果标签。当用户点击取消按钮时,将取消计算任务。

示例2:异步读取文件

下面是另一个示例,说明如何使用BackgroundWorker异步读取文件。

using System.ComponentModel;
using System.IO;
using System.Windows.Forms;

namespace MyApplication
{
    public partial class MainForm : Form
    {
        private BackgroundWorker worker;

        public MainForm()
        {
            InitializeComponent();
            worker = new BackgroundWorker();
            worker.DoWork += new DoWorkEventHandler(DoWorkHandler);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedHandler);
        }

        private void DoWorkHandler(object sender, DoWorkEventArgs e)
        {
            string filename = (string)e.Argument;
            StreamReader reader = new StreamReader(filename);
            string text = reader.ReadToEnd();
            e.Result = text;
        }

        private void CompletedHandler(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show($"Error occurred: {e.Error.Message}");
            }
            else
            {
                string text = (string)e.Result;
                textBox.Text = text;
            }
            openButton.Enabled = true;
        }

        private void OpenButton_Click(object sender, EventArgs e)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string filename = openFileDialog.FileName;
                openButton.Enabled = false;
                worker.RunWorkerAsync(filename);
            }
        }
    }
}

该示例创建一个窗体,该窗体包含一个读取文件按钮和一个文本框。当用户单击读取文件按钮时,将弹出文件对话框,用户可以选择一个文本文件。BackgroundWorker将在后台线程中读取该文件,并将读取的文本返回到UI线程用于更新文本框。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中backgroundworker的使用教程 - Python技术站

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

相关文章

  • C#获取视频某一帧的缩略图的方法

    C#获取视频某一帧的缩略图的方法 在C#中,我们可以使用FFmpeg库和GDI+库来获取视频某一帧的缩略图。本文将提供详细的“C#获取视频某一帧的缩略图的方法”的完整攻略,包括如何使用FFmpeg库和GDI+库获取视频某一帧的缩略图,以及两个示例代码。 使用FFmpeg库获取视频某一帧的缩略图 在使用FFmpeg库获取视频某一帧的缩略图时,我们可以使用以下步…

    C# 2023年5月15日
    00
  • Entity Framework主从表数据加载方式

    Entity Framework(EF)是一种ORM(对象关系映射)框架,是将面向对象编程与关系型数据库结合起来的工具。在许多场景下,我们需要加载主从表间的数据,而Entity Framework提供了几种不同的方式来实现这个目标。 1.贪婪加载( Eager Loading) 贪婪加载是指在加载父对象时,同时将所有相关的子对象一起加载。例如下面这个示例: …

    C# 2023年6月3日
    00
  • vs2017怎么添加js智能提示?

    当使用Visual Studio 2017编写JavaScript代码时,添加智能提示可以提高开发效率。下面是如何在Visual Studio 2017中添加JavaScript智能提示的完整攻略: 首先,在Visual Studio 2017中打开一个JavaScript文件。 在文件菜单中选择“新建项目”,创建空项目。 在你的新项目中,右击项目文件,选择…

    C# 2023年6月8日
    00
  • 初学C#所需明白的那些点

    当你初学 C# 时,需要了解以下几点: 安装C#开发环境 在开始 C# 编程之前,你需要安装 .NET Framework 和 Visual Studio。.NET Framework 提供各种编程语言的软件基础设施,同时和 Windows 操作系统绑定,运行 .NET 程序必须安装该框架。而 Visual Studio 是 Microsoft 开发的一款 …

    C# 2023年6月7日
    00
  • c# 读取Northwind数据库image字段

    读取Northwind数据库中的image字段,可以通过ADO.NET提供的SqlDataReader类或者DataSet类中的DataTable来完成。 以下是实现步骤: 步骤一:连接数据库 使用System.Data.SqlClient命名空间中的SqlConnection类连接Northwind数据库。 示例代码: using System.Data.…

    C# 2023年5月31日
    00
  • C++用winapi socket实现局域网语音通话功能

    首先,要实现局域网语音通话功能,需要借助WinAPI中提供的Socket网络编程接口。本篇攻略将详细介绍如何使用C++和WinAPI Socket实现局域网语音通话功能,其中包括以下步骤: 建立Socket 绑定Socket到本地地址上 监听Socket 接受客户端连接 发送和接收语音数据 关闭Socket 下面将逐步介绍每个步骤的具体实现。 建立Socke…

    C# 2023年6月7日
    00
  • 关于.NET6 Minimal API的使用方式详解

    关于.NET6 Minimal API的使用方式详解 .NET6 Minimal API是.NET6中的一个新特性,它提供了一种更简单、更轻量级的方式来创建Web API。本攻略将详细介绍.NET6 Minimal API的使用方式。 创建.NET6 Minimal API项目 我们可以使用以下命令来创建一个.NET6 Minimal API项目: dotn…

    C# 2023年5月17日
    00
  • c#制作简单启动画面的方法

    下面是详细讲解“C#制作简单启动画面的方法”的攻略。 1. 创建一个空项目 首先,在 Visual Studio 中创建一个空项目,选择 C# 作为开发语言。 2. 添加一个新窗口作为启动画面 在创建好的项目中,右键点击解决方案资源管理器中的项目名称,选择添加,再选择 Windows 窗体,将其命名为 SplashScreenForm。 3. 设置启动画面 …

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