我正在尝试将我的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]);
}
这是正确的方法吗?
我有点担心所有的异步性在这里增加了很多开销。如果我正在为我正在尝试编写的每个单词安排幕后回调,也许我应该继续同步写一整个事情?
当我们回到同步时代,我理解缓冲是如何工作的。我写了我的输出流,它实际上是在幕后缓冲的。当缓冲区足够时,它被刷新并实际同步地写入套接字。但是,当我异步工作时,这是如何工作的?它还在缓冲吗?或者我是否真的在等到下一个小写之前等待完成每一个小写?
答案 0 :(得分:4)
我希望缓冲能够独立于同步 - 所以当它缓冲时,“异步”写入可能实际上是同步完成的(因为它只是在内存中),此时它真的,非常便宜{{1 }}
当缓冲区变得足够大时,它将开始写入套接字,此时await
实际上将与额外(小)命中异步。
但是,我建议您只需将单词连接在一起然后执行单次写操作即可使代码更简单。毕竟你已经拥有所有数据了 - 这不像你在等待其中的一些数据。
此时,您将只有一个异步调用,因此您甚至不需要使用await
:
await