首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Comet风格的API消费带异步/等待

Comet风格的API消费带异步/等待
EN

Stack Overflow用户
提问于 2018-09-21 23:18:01
回答 1查看 182关注 0票数 1

我试图从Comet样式的HTTP中读取,您可以连接到该API,并且它会不断地推送事件。我希望它在启动后在后台运行,但是我的异步/等待是错误的--它冻结了我的UI,我不知道为什么。

代码语言:javascript
复制
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));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-22 00:14:27

如果您的按钮单击事件只在后台启动作业,那么使用async异步没有意义,等待Task.Run也没有意义,因为之后什么都不做。只需按一下按钮就可以了:

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e)
{
    Task.Run(async () => await PushEventReader());
}

Task.Run将对传递给它的任何工作排队,以便在ThreadPool上运行,这将有效地使其在后台运行。

Extra:您正在使用的WebClient是一个非托管资源(您可以注意到,由于它实现了IDisposable接口),在一个using块中使用它们是一个很好的实践,它将为您处理处理:

代码语言:javascript
复制
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));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52452078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档