Как я могу использовать ProgressBar с Async? - PullRequest
0 голосов
/ 29 октября 2019

Управление индикатором выполнения с помощью фонового работника усложнило мой проект после определенного места. В этом случае я решил перейти на асинхронную структуру, я построил архитектуру на асинхронной структуре. Но на этот раз я не знал, как управлять индикатором выполнения при асинхронной структуре.

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

Но это не работает. Я использовал фоновый работник. Я задавал этот вопрос. Но вы, ребята, предложили мне фонарик. Но фоновый работник, через какое-то время появляется ошибка и система не отвечает мне?

1 Ответ

2 голосов
/ 29 октября 2019

Вопрос не задан. BackgroundWorker в любом случае устарел с 2012 года.

Если вы хотите сообщить о прогрессе из любого фонового потока, а не только потоков, созданных с помощью Task.Run, создайте 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));
        });
    }
}

Проверка Асинхронизация в 4.5: Включение выполнения и отмены в API-интерфейсах Async для примера как отчета о ходе выполнения, так и отмены

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...