Если ваше событие нажатия кнопки не означает ничего, кроме запуска задания в фоновом режиме, то нет смысла делать асинхронным с async
, и нет никакого смысла ждать Task.Run
, так как после этого вы ничего не делаете.Вы можете просто нажать кнопку следующим образом:
private void button1_Click(object sender, EventArgs e)
{
Task.Run(async () => await PushEventReader());
}
Task.Run
поставит в очередь любую работу, которую вы ему передадите, для запуска на ThreadPool, что эффективно заставит его работать в фоновом режиме.
Дополнительно: WebClient
, который вы используете, является неуправляемым ресурсом (вы можете заметить, что он реализует интерфейс IDisposable
), и рекомендуется использовать их внутри using
Блок, который будет обрабатывать для вас:
public async Task PushEventReader()
{
var uri = "url.to/api";
using (var client = new WebClient())
{
client.OpenReadCompleted += async (sender, e) =>
{
using (var reader = new StreamReader(e.Result))
{
while (!reader.EndOfStream)
{
var line = await reader.ReadLineAsync();
Console.WriteLine(line);
}
}
};
await client.OpenReadTaskAsync(new Uri(uri));
}
}