Фоновый объект вызывает событие «RunWorkerCompleted», когда процесс не завершен - PullRequest
0 голосов
/ 31 декабря 2018

Мой объект Background Worker вызывает событие «RunWorkerCompleted», когда цикл foreach в нем только что вернулся 1 раз, независимо от того, как долго цикл вращается после этого триггера, никогда не запускает его снова (я говорю о текущем сеансе),Почему он это делает?Как это исправить?

(ключевые слова "private async void" используются в фоновом событии DoWork, есть один цикл foreach, в этом цикле есть метод, запускаемый "await".)

Один пример;

private async void bgwCheckFiles_DoWork(object sender, DoWorkEventArgs e)
{
    string a;
    foreach (string s in lblist.Items) { a = await getMD5HashFromFile2(s); }
}

private void bgwCheckFiles_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ MessageBox.Show("Process ended."); }

Когда этот код еще не завершен, система «Процесс завершен».давая это сообщение.

1 Ответ

0 голосов
/ 31 декабря 2018

Поскольку вы используете метод async void, выполнение этого метода заканчивается при первой блокировке await, что означает, что работа считается завершенной для BackgroundWorker.

Если вы 'Вы уже используете асинхронные API, вам не нужно BackgroundWorker.Вам просто нужно что-то вроде этого:

private async Task GetMD5HashFromFilesAsync()
{
    foreach (string s in lblist.Items)
    {
        await getMD5HashFromFile2(s).ConfigureAwait(false);
    }
}

И, предположим, вы вызываете это из обработчика событий:

private async void bgwCheckFiles_RunWorkerCompleted(object sender, EventArgs e)
{
    await GetMD5HashFromFilesAsync();
    MessageBox.Show("Process ended.");
}
...