当前位置:首页 > 开发 > C# > 正文内容

C# BackgroundWorker,在DoWork里更新控件内容

C#8个月前 (12-25)

一般情况下不可以直接在BackgroundWorker的DoWork事件中更新 UI 控件

在BackgroundWorker的DoWork事件处理方法中,代码是在后台线程中执行的。而在 Windows Forms 等应用程序中,大多数 UI 控件都不是线程安全的,直接从非 UI 线程(后台线程)更新 UI 控件可能会导致不可预测的行为,如程序崩溃、显示异常等。

正确的做法是使用ProgressChanged事件来更新 UI

BackgroundWorker提供了一种安全的机制来报告进度并更新 UI。在DoWork事件处理方法中,可以通过调用BackgroundWorker的ReportProgress方法。

例如:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    for (int i = 1; i <= 100; i++)
    {
        if (worker.CancellationPending)
        {
            e.Cancel = true;
            break;
        }
        else
        {
            // 模拟工作进度,这里可以是实际的耗时操作
            System.Threading.Thread.Sleep(100);
            worker.ReportProgress(i);
        }
    }
}

然后在ProgressChanged事件处理方法中更新 UI 控件,如更新进度条的值或显示相关信息:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    label1.Text = $"进度:{e.ProgressPercentage}%";
}

所以,不建议在DoWork事件中直接更新 UI 控件,而应该通过ReportProgress和ProgressChanged事件来安全地更新 UI。

转载请注明出处。

本文链接:http://pythonopen.com/?id=1629

返回列表

上一篇:C# 类接口

下一篇:C# OnMeasureItem

相关文章

获取鼠标坐标位置

方式1 //获取鼠标光标的位置(以屏幕坐标表示)    &...

C# 文件属性与转换为字节

获取文件属性    FileInfo fileInfo&nb...

C# decimal

概述在 C# 中,decimal是一种数据类型,用于表示高精度的十进制数值。它主要用于需要精确计算的...

C# 类接口

定义接口是一种抽象类型,它定义了一组方法签名(方法名称、参数列表和返回类型),但没有方法体。接口用于...

c# Invalidate、Refresh、Refreshitem、Refreshitems的功能

Invalidate方法功能概述Invalidate方法主要用于使控件的特定区域(整个控件或部分区域...

C# Byte[]转为Image

以下是在 C# 中将byte[](字节数组,通常表示图像的二进制数据)转换为Image类型的常见方法...