Потребление API в стиле Comet с использованием Async / Await - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь прочитать HTTP-API в стиле Comet, к которому вы подключаетесь, и он постоянно отправляет события.Я хочу, чтобы это запускалось в фоновом режиме после запуска, но мой Async / Await ошибочен, он замораживает мой пользовательский интерфейс, и я не знаю почему.

private async void button1_Click(object sender, EventArgs e)
{
    await Task.Run((Func<Task>)PushEventReader);
}

public async Task PushEventReader()
{
    var uri = "url.to/api";
    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));
}

1 Ответ

0 голосов
/ 22 сентября 2018

Если ваше событие нажатия кнопки не означает ничего, кроме запуска задания в фоновом режиме, то нет смысла делать асинхронным с 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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...