Asp.net 使用.net 4.5中的async/await对HttpResponse进行多个小写入的正确方法
我正在尝试将我的HTTP响应实现为完全异步(使用async/await) 这是一个很好的简化,但让我们假设我需要进行多个小型写入:Asp.net 使用.net 4.5中的async/await对HttpResponse进行多个小写入的正确方法,asp.net,.net,async-await,httpresponse,asp.net-4.5,Asp.net,.net,Async Await,Httpresponse,Asp.net 4.5,我正在尝试将我的HTTP响应实现为完全异步(使用async/await) 这是一个很好的简化,但让我们假设我需要进行多个小型写入: for (int i=0; i<1000; i++) WriteToResponse(words[i]); for(int i=0;i我希望缓冲独立于同步性-因此,在缓冲时,“异步”写入很可能实际同步完成(因为它只是在内存中),此时等待非常非常便宜 当缓冲区足够大时,它将开始写入套接字,此时,await实际上是异步的,只需额外(少量)命中 但是,我建议您可以
for (int i=0; i<1000; i++) WriteToResponse(words[i]);
for(int i=0;i我希望缓冲独立于同步性-因此,在缓冲时,“异步”写入很可能实际同步完成(因为它只是在内存中),此时等待非常非常便宜
当缓冲区足够大时,它将开始写入套接字,此时,await
实际上是异步的,只需额外(少量)命中
但是,我建议您可以通过将单词连接在一起,然后执行一次写入来简化代码。毕竟,您已经拥有了所有数据—您不会等待其中的一些数据
此时,您将只有一个异步调用,因此您甚至不需要使用wait
:
Task Respond(HttpResponse res)
{
string data = string.Join("", words.Take(1000)); // Or whatever
return res.Output.WriteAsync(data);
}
我希望缓冲独立于同步性——因此,当它进行缓冲时,“异步”写入可能实际上是同步完成的(因为它只是在内存中),在这一点上,等待是非常非常便宜的
当缓冲区足够大时,它将开始写入套接字,此时,await
实际上是异步的,只需额外(少量)命中
但是,我建议您可以通过将单词连接在一起,然后执行一次写入来简化代码。毕竟,您已经拥有了所有数据—您不会等待其中的一些数据
此时,您将只有一个异步调用,因此您甚至不需要使用wait
:
Task Respond(HttpResponse res)
{
string data = string.Join("", words.Take(1000)); // Or whatever
return res.Output.WriteAsync(data);
}
你真的需要调用WriteAsync
吗?@CuongLe假设我的服务器有10000个并发客户端(比我的线程池能够处理的多得多)。为了能够处理这些类型的负载,我必须严格保持一切异步。您真的需要调用WriteAsync
吗?@CuongLe假设我的服务器有10000个并发客户端(比我的线程池能够处理的多得多)我必须保持每件事的异步性才能处理这种负载我仍然不敢相信传奇人物乔恩·斯基特(Jon Skeet)会回答我:)这些词只是一种简化。实际上,我在内存中有一个复杂的对象,我在遍历它的过程中遍历并编写它的一部分。我自己来缓冲整个事情是非常费力的。如果我正确理解了你的答案,我可以一边写一边异步写,它会为我缓冲。@talkol:当响应足够小时,它会被缓冲。如果要强制执行总缓冲,可以改为写入StringWriter
,然后在末尾执行一个WriteAsync
。当然,要做的事情是尽早测试——检查它是否能满足您的要求。我仍然不敢相信传奇人物乔恩·斯基特(Jon Skeet)会回答我:)这些词只是一种简化。实际上,我在内存中有一个复杂的对象,我在遍历它的过程中遍历并编写它的一部分。我自己来缓冲整个事情是非常费力的。如果我正确理解了你的答案,我可以一边写一边异步写,它会为我缓冲。@talkol:当响应足够小时,它会被缓冲。如果要强制执行总缓冲,可以改为写入StringWriter
,然后在末尾执行一个WriteAsync
。当然,要做的事情是尽早测试——检查它是否能满足您的要求。