Как использовать ожидание асинхронного процесса в C #? - PullRequest
0 голосов
/ 14 января 2019

У меня проблема с моим кодом. У меня есть лаунчер и автообновления. я хочу распаковать процесс ждать загрузки, но я не могу это сделать. Вы можете мне помочь?

Привет, У меня проблема с моим кодом. У меня есть лаунчер и автообновления. я хочу распаковать процесс ждать загрузки, но я не могу это сделать. Вы можете мне помочь?

async void DownFile(string savep, string url)
{
    using (WebClient webClient = new WebClient())
    {
        webClient.UseDefaultCredentials = true;
        webClient.DownloadProgressChanged += client_DownloadProgressChanged;
        webClient.DownloadFileCompleted += client_DownloadFileCompleted;
        await webClient.DownloadFileTaskAsync(new Uri(url), savep);
    }   
}

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "Download In Process";
    DownFile(savep, url);
    label1.Text = "unzip";

    Program.ExtractZipFile(savep, "", Application.StartupPath);

    button1.Enabled = false;
}

Await - проблема с асинхронной загрузкой

1 Ответ

0 голосов
/ 14 января 2019

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

async Task DownFile(string savep, string url)
{
    using (WebClient webClient = new WebClient())
    {
        webClient.UseDefaultCredentials = true;
        webClient.DownloadProgressChanged += client_DownloadProgressChanged;
        webClient.DownloadFileCompleted += client_DownloadFileCompleted;
        await webClient.DownloadFileTaskAsync(new Uri(url), savep);
    }   
}

private async void button1_Click(object sender, EventArgs e)
{
    label1.Text = "Download In Process";
    await DownFile(savep, url);
    label1.Text = "unzip";

    Program.ExtractZipFile(savep, "", Application.StartupPath);

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