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

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

C#9个月前 (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# 获取Windows系统目录

Environment.GetFolderPath(Environment.SpecialFolde...

C# double转为string并保留两位小数

在 C# 中,可以使用多种方式将 double 类型的数据转换为 string 类型并保留两位小数,...

C# BackgroundWorker的例子

以下是一个使用 BackgroundWorker 组件在 C# 中实现后台执行任务,同时在主线程更新...

C# Graphics文本抗锯齿

g.TextRenderingHint = TextRenderingHint....

C# i++和++i的区别

核心区别操作顺序            ...

C# 比较两个Image对象是否相同

方法思路基础检查:先检查空引用和图像尺寸像素格式验证:确保两个图像的像素格式相同内存锁定:使用Loc...