Как я могу заставить этот код работать?
Это невозможно сделать, поскольку подпись async Task
не реализована для обработчиков событий пользовательского интерфейса в .net. (обязательно прочитайте этот пост: Почему обработчики событий всегда имеют возвращаемый тип void? )
По общему мнению, возвращаемое значение обработчика события не имеет четко определенной цели. Хотя IMO имело бы смысл иметь возможность отключить все асинхронные обработчики, но опять же, это было бы именно так, если бы вы не ожидали логики внутри него.
Конечно, вы можете преодолеть проблему, поместив логику событий в другой класс. В любом случае, в большинстве случаев это действительно хорошая идея.
Примечание: не используйте это так, это просто для объяснения
public Form1 : Form
{
public Form1()
{
...
this.button1.Click += new System.EventHandler(this.button1_Click);
}
private async void button1_Click(object sender, EventArgs e) // line A
{
await YourLogic(e.foo); //optional configure await.
}
private async Task YourLogic(your parameters)
{
// do stuff
}
}
Смотри также:
Почему обработчики событий всегда имеют тип возврата void?
async / await - когда вернуть задание void void?
https://msdn.microsoft.com/en-us/magazine/jj991977.aspx
Как мне ждать событий в C #?
<Ч />
Как сделать так, чтобы события формы использовали преимущества асинхронности?
Итак, в основном это уже происходит, но посмотрите этот пост:
Как «ожидать» вызова события EventHandler