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

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

C#1年前 (2024-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://www.pythonopen.com/?id=1629

返回列表

上一篇:C# 类接口

下一篇:C# OnMeasureItem

相关文章

C# 获取带有焦点的控件

this.ActiveControl...

C# 计算平年闰年

一个年份整除4取余,如果有余数,则为平年,如果没有余数,则是闰年。但如果是这个年份是100的倍数,则...

在 C# 中实现类似于 Windows 资源管理器的“名称”排序方式

要在 C# 中实现类似于 Windows 资源管理器的“名称”排序方式,你需要考虑以下几点:1. 不...

C# 跳出foreach循环

在 C# 中,如果你想在 foreach 循环内部提前跳出当前这一轮循环,继续执行下一轮循环,可以使...

C# 类接口

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

C# Byte[]转为Image

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