1

我正在尝试将我的 HTTP 响应实现为完全异步(使用 async/await)。

这是一个很好的简化,但让我们假设我需要进行多个小写操作:

for (int i=0; i<1000; i++) WriteToResponse(words[i]);

例如,一个用例是将对象手动编码为 JSON 或 XML,并在对象遍历期间遇到每个对象时将其写入响应。

我目前的实现是:

async Task Respond(HttpResponse res)
{
    for (int i=0; i<1000; i++) await res.Output.WriteAsync(words[i]);
}

这是正确的方法吗?

我有点担心所有的异步都会在这里增加很多开销。如果我在后台为我要写的每个单词安排回调,也许我应该继续同步写整个事情?

当我们回到同步时代时,我了解缓冲是如何工作的。我写了我的输出流,它实际上是在幕后缓冲的。当缓冲区足够满时,它被刷新并实际同步写入套接字。但是当我异步工作时这是如何工作的?还缓冲吗?还是我真的在等待每一个小写的完成,然后再写下一个?

4

1 回答 1

4

我希望缓冲独立于同步性 - 所以在缓冲时,“异步”写入可能实际上是同步完成的(因为它只是在内存中),此时它真的非常便宜await

当缓冲区变得足够大时,它将开始写入套接字,此时await真的是异步的,并带有额外的(小)命中。

但是,我建议您无论如何都可以通过将单词连接在一起然后执行一次写入来简化您的代码。毕竟,您已经拥有了所有数据——您不必等待其中的一些数据。

那时,您将只有一个异步调用,因此您甚至不需要使用await

Task Respond(HttpResponse res)
{
    string data = string.Join("", words.Take(1000)); // Or whatever
    return res.Output.WriteAsync(data);
}
于 2013-08-15T09:55:38.350 回答