我如何将ProgressBar与异步一起使用?

问题描述 投票:-3回答:1

与背景工作人员一起控制进度条使我的项目在某个特定位置发生困难。在这种情况下,我决定继续使用异步结构,并在异步结构上构建了该架构。但是这次我不知道如何在异步结构下控制进度条。您对此问题有何想法和意见?

 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;
            });
        }); 
    }

但是它没有用。我是背景工作者。我在问这个问题。但是你们向我建议了背景工作者。但是backgroundworker,过一段时间后出现错误,系统没有对我答复?

我能做些什么,请帮帮我!

c# asynchronous
1个回答
0
投票

问题不明确。无论如何,BackgroundWorker自2012年以来就过时了。

如果您要报告any后台线程的进度,而不仅仅是使用Task.Run创建的线程,请在UI线程中创建一个Progress<T>并将其仅作为IProgress<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));
        });
    }
}

检查Async in 4.5: Enabling Progress and Cancellation in Async APIs以获取进度报告和取消的示例

© www.soinside.com 2019 - 2024. All rights reserved.