Response.WriteAsync和返回字符串之间的区别是什么

时间:2017-03-18 08:10:09

标签: c# asp.net-core

嗨,如果有人能向我解释这两种从控制器返回数据的方法之间的区别,我就会徘徊。 使用on方法优于另一方是否有优势或理由?

我猜测返回的函数只是调用了Response.WriteAsync,但我不确定。

使用postman这两种方法都会返回完全相同的响应,所以我只是对这两个选项感到好奇,是否有理由使用其中一个或仅仅是个人偏好。

在Response.WriteAsync:

之间
[HttpGet("Fetch_WriteAsync")]
public async Task Fetch_AsyncWrite()
{
    HttpContext.Response.ContentType = "application/json";
    await HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(new { data = "my_fetched_data" }));
}

然后回来:

[HttpGet("Fetch_Return")]
public async Task<string> Fetch_Return()
{
    HttpContext.Response.ContentType = "application/json";
    return await Task.Factory.StartNew(()=>JsonConvert.SerializeObject(new { data = "my_fetched_data" }));
}

1 个答案:

答案 0 :(得分:5)

基本上,您的代码在引擎盖下的执行方式存在差异。在第一种情况下,你有这个

await HttpContext.Response
                 .WriteAsync(JsonConvert.SerializeObject(new 
                  { 
                      data = "my_fetched_data" 
                  }));

ASP.NET线程将用于执行您的代码。

在第二种情况下,你有这个

return await Task.Factory
                 .StartNew(()=>JsonConvert.SerializeObject(new 
                 { 
                     data = "my_fetched_data" 
                 }));

将使用线程池线程。

正如here所述:

  

您可以在ASP.NET中以完全相同的方式使用ThreadPool   像你期望的那样工作。 问题不在ThreadPool中   本身,但在ASP.NET使用它的同时。 ASP.NET   是设计多线程的,它使用ThreadPool来提供页面   和内容映射到ASP.NET ISAPI过滤器。

     

如果您还使用ThreadPool,那么ASP.NET拥有的线程更少   利用和请求被暂停,直到游泳池返回免费   的螺纹即可。对于流量较低的站点,这可能不是问题,但更多   热门网站可能会遇到麻烦。低流量站点可以进入   如果他们经常使用ThreadPool会有麻烦。

话虽如此,我会选择第一个解决方案。