Ejemplo simple de C# BackgroundWorker

Introducción a los trabajadores de fondo

BackgroundWorker es un componente que se utiliza para realizar operaciones en segundo plano. Proporciona una manera fácil de realizar tareas que consumen mucho tiempo fuera del subproceso de la interfaz de usuario, mientras mantiene la capacidad de respuesta de la interfaz de usuario.

BackgroundWorker se usa principalmente para procesar tareas de ejecución prolongada en segundo plano para evitar bloquear el subproceso de la interfaz de usuario (IU). Por ejemplo, cuando necesite realizar algún cálculo complejo, descargar un archivo grande, realizar operaciones de base de datos o comunicarse con un servidor remoto, puede usar BackgroundWorker para asegurarse de que estas tareas se realicen en segundo plano sin congelar la interfaz de usuario.

ejemplo sencillo

Ejemplo 1: Ejecutar una sola operación que requiere mucho tiempo

// Form1.cs
public partial class Form1 : Form
{
    
    
    public Form1()
    {
    
    
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    
    
        using (BackgroundWorker backgroundWorker = new BackgroundWorker())
        {
    
    
            backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
            backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
            backgroundWorker.RunWorkerAsync(); // 可以传入参数
        }

        // 后续过程(不会被 BackgroundWorker 阻塞,即不会等待其完毕再执行)
        // ...
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
    
    
        //e.Argument // 可以取得传入的参数

        // 模拟耗时操作
        //...
        string result = "...";
        
        // 传递结果
        e.Result = result;
    }

    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    
    
        textBox1.Text = e.Result.ToString(); // 输出结果
    }
}

Ejemplo 2: Realice operaciones por lotes que consumen mucho tiempo, admita el progreso y la cancelación

// Form1.cs
public partial class Form1 : Form
{
    
    
    public Form1()
    {
    
    
        InitializeComponent();
    }

    private BackgroundWorker backgroundWorker = null;

    private void Button1_Click(object sender, EventArgs e) // 开始按钮
    {
    
    
        // 初始化 BackgroundWorker
        if (backgroundWorker != null && backgroundWorker.IsBusy) return;
        backgroundWorker = new BackgroundWorker();

        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.WorkerSupportsCancellation = true;

        backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
        backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
        backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
        backgroundWorker.RunWorkerAsync(); // 可以传入参数


        // 后续过程(不会被 BackgroundWorker 阻塞,即不会等待其完毕再执行)
        // ...
    }

    private void Button2_Click(object sender, EventArgs e) // 取消按钮
    {
    
    
        if (backgroundWorker == null) return;
        if (backgroundWorker.IsBusy && !backgroundWorker.CancellationPending) // 申请取消
        {
    
    
            backgroundWorker.CancelAsync();
        }
    }
    
    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
    
    
        //e.Argument // 可以取得传入的参数

        // 模拟批量操作
        for (int i = 0; i < 100; i++)
        {
    
    
            // 检查是否有取消申请
            if (backgroundWorker.CancellationPending)
            {
    
    
                e.Cancel = true;
                return;
            }

            // 模拟耗时操作
            System.Threading.Thread.Sleep(50);

            // 反馈进度
            backgroundWorker.ReportProgress(i + 1);
        }
        string result = "...";

        // 传递结果
        e.Result = result;
    }

    private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    
    
        textBox1.Text = $"正在运行:{
      
      e.ProgressPercentage}/100"; // 输出进度
    }

    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    
    
        textBox1.Text = (!e.Cancelled) ? $"运行结果:{
      
      e.Result}" : "已取消"; // 输出结果

        // 释放 BackgroundWorker
        backgroundWorker.Dispose();
        backgroundWorker = null;
    }
}

Supongo que te gusta

Origin blog.csdn.net/xzqsr2011/article/details/131459087
Recomendado
Clasificación