Oliver Kötter
Oliver Kötter

Reputation: 996

Using async/await: await returns too early

I have a simly Windows Forms app with just a button and a progressbar on it.

Then I have this code:

private async void buttonStart_Click(object sender, EventArgs e)
{
    progressBar.Minimum = 0;
    progressBar.Maximum = 5;
    progressBar.Step = 1;
    progressBar.Value = 0;

    await ConvertFiles();
    MessageBox.Show("ok");
}

private async Task ConvertFiles()
{
    await Task.Run(() => 
    {
        for (int i = 1; i <= 5; i++)
        {
            System.Threading.Thread.Sleep(1000);
            Invoke(new Action(() => progressBar.PerformStep()));
        }
    });
}

The await ConvertFiles(); returns too early, the ok messagebox already appears at about 80% progress.

What am I doing wrong?

Upvotes: 3

Views: 913

Answers (2)

edwin the duck
edwin the duck

Reputation: 95

Just to be safe why not move the

MessageBox.Show("ok");

into a Continuewith so:

            await ConvertFiles().ContinueWith((t) => { MessageBox.Show("ok"); });

this makes sure it only runs when the task is complete

Upvotes: 0

Ivan Stoev
Ivan Stoev

Reputation: 205629

The problem you are experiencing is not related to the async/await, which you use correctly. The await is not returning too early, just the progress bar updates too late. In other words, this is a progress bar control specific problem described in a several threads - Disabling .NET progressbar animation when changing value?, Disable WinForms ProgressBar animation, The RunWorkerCompleted is triggered before the progressbar reaches 100% etc. You can use one of the workarounds provided in those threads.

Upvotes: 6

Related Questions