Я делаю некоторые тесты с новым асинхронным шаблоном С# 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().