Я делаю некоторые тесты с новым асинхронным шаблоном С# 5.0 (async/await) У меня проблема с пониманием того, как вызываются асинхронные методы.
Учитывая этот код:
private async Task<string> DownloadAsync()
    {
        progress.ProgressChanged += (s, e) =>
            {
                progressBar1.Value = e.value;
            };
            return await DownloadSomething(myurl, progress);
    }
private async void CallDownloadAsync()
    {
        string text = await DownloadAsync();
        progressBar1.Value = 0;
        label1.Text = "Done!";
    }
private void button4_Click(object sender, EventArgs e)
    {
        CallDownloadAsync();
    }
Итак, этот код работает очень хорошо. Когда я нажимаю кнопку "button4", начинается загрузка, и мой ProgressBar обновляется правильно.
Но я хотел бы немного уменьшить свой код, удалив метод CallDownloadAsync() следующим образом:
private void button4_Click(object sender, EventArgs e)
    {
        new Action(async () =>
        {
            string result = await Task.Run<string>(() => DownloadAsync());
        }).Invoke();
        label1.Text = "Running...";
    }
Итак, здесь я хочу, чтобы прямо инициировать действие, которое вызывает метод DownloadAsync, но когда я нажимаю на свою Button4, у меня есть операция Неверная операция на основе progressBar. Поэтому я не понимаю, в чем основное отличие между Action() и вызовом моего метода CallDownloadAsync().
