Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将缓冲区写入响应流还是在长时间运行的请求结束时写入?_.net_Asp.net Mvc_Asp.net Core_Asp.net Core Mvc_.net Core - Fatal编程技术网

.net 将缓冲区写入响应流还是在长时间运行的请求结束时写入?

.net 将缓冲区写入响应流还是在长时间运行的请求结束时写入?,.net,asp.net-mvc,asp.net-core,asp.net-core-mvc,.net-core,.net,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,.net Core,以下是运行.NET Framework的ASP.NET核心API。这是我的一个MVC控制器 我必须从一个外部服务获取数据,让我一次只能获取相当小的数据缓冲区——我无法控制这一点。假设我每个缓冲区有500行数据,但我的客户机希望所有数据同时格式化为CSV,因此我必须循环调用外部源,如下所示: [HttpGet] public async Task<IActionResult> Get(MyRequest request) { var aggregateResponse = aw

以下是运行.NET Framework的ASP.NET核心API。这是我的一个MVC控制器

我必须从一个外部服务获取数据,让我一次只能获取相当小的数据缓冲区——我无法控制这一点。假设我每个缓冲区有500行数据,但我的客户机希望所有数据同时格式化为CSV,因此我必须循环调用外部源,如下所示:

[HttpGet]
public async Task<IActionResult> Get(MyRequest request)
{
    var aggregateResponse = await client.GetDataAsync(request);
    while (aggregateResponse.HasMoreData)
    {
        request.Cookie = aggregateResponse.Cookie;
        var response = await client.GetDataAsync(request);
        //Data is a list of objects containing n number of properties
        aggregateResponse.Data.Concat(response.Data)

        //I need the cookie from the previous response to get the next buffer
        aggregateResponse.Cookie = response.Cookie;
        aggregateResponse.HasMoreData = response.HasMoreData;
    }
    //runs through a generic IEnumerable CSV output formatter (uses reflection)
    return Ok(aggregateResponse.Data);
}
不幸的是,这可能需要100-200个循环才能取回aggregateResponse.data中50000-100000个列表项的所有数据,但我在这方面没有太多选择

将每个数据缓冲区格式化为循环中的CSV并每次将其写入响应流会更有效吗,还是像我目前所做的那样等到结束会更好?例如:

[HttpGet]
public async Task<IActionResult> Get(MyRequest request)

{
    var response = await client.GetDataAsync(request);
    await Response.WriteAsync(formatBeginningData(response.Data))
    while (request.HasMoreData)
    {
        request.Cookie = aggregateResponse.Cookie;
        response = await client.GetDataAsync(request);
        await Response.WriteAsync(formatData(response.Data))
        request.Cookie = response.Cookie;
        request.HasMoreData = response.HasMoreData;
    }

    return Ok();
}
在这个方法中,我一直在使用async进行数据调用,但这意味着线程要切换很多次。异步执行此操作是否真的会降低性能?所有这些都应该是同步方法签名和数据调用吗

将每个数据缓冲区格式化为循环中的CSV并每次将其写入响应流会更有效吗,还是像我目前所做的那样等到结束会更好

您可以流式处理,但我不推荐它,除非数据太大,无法放入内存

流式传输的优点是,数据不必放入内存,客户端可以逐段接收数据

流式传输的缺点是,必须在流式传输开始之前发送HTTP响应代码,因此在流式传输开始后无法通知客户端错误。因此,如果其中一个对GetDataAsync的调用失败,客户机仍然会得到一个200 OK,但其数据会意外地被切断

在这个方法中,我一直在使用async进行数据调用,但这意味着线程要切换很多次。异步执行此操作是否真的会降低性能?所有这些都应该是同步方法签名和数据调用吗

没有;ASP.NET核心上的异步代码与同步代码具有相同或更少的线程开关