首页 > 解决方案 > 如何将 ProgressBar 与 Async 一起使用?

问题描述

使用 backgroundworker 控制进度条使我的项目在某个地方之后变得困难。在这种情况下,我决定转向异步结构,我在异步结构上构建架构。但是这次我不知道如何控制异步结构下的进度条。

 private async void button3_Click(object sender, EventArgs e)
    {
        progressBar1.Value = 1;
        int value = 1;
        await ProgressBarControl(value);
        await Convert();

    }
    public Task ProgressBarControl(int e)
    {
        return Task.Run(() =>
        {
            var progress = new Progress<int>(percent =>
            {
                progressBar1.Value = percent;
            });
        }); 
    }

但它不起作用。我使用了后台工作人员。我在问这个问题。但是你们向我建议了背景工作者。但是后台工作人员,一段时间后出现错误并且系统没有回复我?

标签: c#asynchronous

解决方案


这个问题不清楚。无论如何,BackgroundWorker 自 2012 年以来已过时。

如果您想报告任何后台线程的进度,而不仅仅是使用创建的线程,请在 UI 线程中Task.Run创建 aProgress<T>并将其仅作为 anIProgress<T>传递给后台线程或任务,例如:

private async void button3_Click(object sender, EventArgs e)
{
    var progress = new Progress<int>(percent =>
    {
        progressBar1.Value = percent;
    });

    progressBar1.Value = 1;
    int value = 100;
    await DoSomeWork(value,progress);
}

public Task DoSomeWork(int iterations,IProgress<int> progress)
{
    for(int i=0;i<iterations;i++)
    {
        await Task.Run(()=>{
           DoSomethingReallySlow(i);
           progress.Report(i*100/iterations));
        });
    }
}

检查4.5 中的异步:在异步 API中启用进度和取消,以获取进度报告和取消的示例


推荐阅读