Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C#使用async和Wait发布ID块并合并响应_C#_Linq_Asynchronous_Async Await - Fatal编程技术网

C#使用async和Wait发布ID块并合并响应

C#使用async和Wait发布ID块并合并响应,c#,linq,asynchronous,async-await,C#,Linq,Asynchronous,Async Await,我正在编写一个方法,它接受一个ID列表来调用API。 API有一个限制,一次只能接受1000个ID。因此,我需要将列表分为多个部分,并分别进行调用 public async Task<List<JObject>> readData(List<int> IDs){ const int APIMaxLimit = 1000; List<List<int>> chunks = new List<List<int&g

我正在编写一个方法,它接受一个ID列表来调用API。 API有一个限制,一次只能接受1000个ID。因此,我需要将列表分为多个部分,并分别进行调用

public async Task<List<JObject>> readData(List<int> IDs){
    const int APIMaxLimit = 1000;
    List<List<int>> chunks = new List<List<int>>();
    while (IDs.Any())
    {
        chunks.Add(IDs.Take(APIMaxLimit).ToList());
        IDs= IDs.Skip(APIMaxLimit).ToList();
    }
    var apiCallTasks = new List<Task>();
    foreach (var chunk in chunks)
    {
        //some logic
        apiCallTasks.Add(ReadDatacentersFromResponse(response));
    }

    await Task.WhenAll(apiCallTasks);

    //What do I return?

}

private static async Task<List<JObject>> ReadDatacentersFromResponse(HttpResponseMessage response);
公共异步任务读取数据(列表ID){
常数int APIMaxLimit=1000;
列表块=新列表();
while(IDs.Any())
{
Add(id.Take(APIMaxLimit.ToList());
IDs=IDs.Skip(APIMaxLimit.ToList();
}
var apiCallTasks=新列表();
foreach(var chunk in chunks)
{
//一些逻辑
Add(ReadDatacentersFromResponse(response));
}
等待任务。WhenAll(apiCallTasks);
//我该退什么?
}
专用静态异步任务ReadDatacentersFromResponse(HttpResponseMessage响应);

我写了上面的代码,但我不知道如何返回组合值。还有,有没有一种方法可以编写更优雅的代码而不使用for循环

一般来说,您可以使用
。选择many
将多个
IEnumerable
组合成一个
IEnumerable

var data = new List<List<int>>
    {
        new List<int>{1,2,3},
        new List<int>{4,5,6},
        new List<int>{7,8,9}
     };

var result = data.SelectMany(x => x);


这是另一个答案,尽管我更喜欢布拉德利的。简单的完整示例,尽管我使用int而不是JObjects。如果性能是一个问题,您可以查看
ArraySegment
。我们的解决方案都不是特别快

    private async Task<List<int>> ReturnInts()
    {
        return new List<int> { 5 };
    }

    public async Task<List<int>> PenanceFunction()
    {
        List<Task<List<int>>> tasks = new List<Task<List<int>>>();
        tasks.Add(ReturnInts());
        tasks.Add(ReturnInts());
        List<int> myResults = new List<int>();
        await Task.WhenAll(tasks);
        foreach(var t in tasks)
        {
            myResults.AddRange(t.Result);
        }
        return myResults;
    }
private async Task ReturnInts()
{
返回新列表{5};
}
公共异步任务惩罚函数()
{
列表任务=新列表();
tasks.Add(ReturnInts());
tasks.Add(ReturnInts());
List myResults=新列表();
等待任务。何时(任务);
foreach(任务中的var t)
{
myResults.AddRange(t.Result);
}
返回我的结果;
}

@zzxyz我真的没有看到他的问题有什么超级复杂的地方。虽然它使用
async
/
wait
,但他需要的答案与它没有直接关系。这一切都可以简化为将一个数字列表分成若干批,然后重新组合它们,而不会有太大的变化。@zzxyz这似乎有点下意识,对我没有帮助。OP无需进行任何“
Run()
调用”即可使其代码正常工作。他/她有一个合理的问题,即如何将他/她正在等待的任务的结果与
任务相结合。当所有的
呼叫时,他/她没有?他的任务会自动运行吗?我错过了什么?我猜问题是他不知道如何检查任务的返回值。如果这不是问题所在,
.AddRange()
。完成。我并不是想装傻,只是说像这样的问题不是学习异步模式的好地方。web服务器可能已关闭,或者其他一百个问题中的一个可能会使问题复杂化。不过,也许我在这里完全错了,而且他使用的语法确实运行任务?@zzxyz他在简化发布代码时,可能只是遗漏了一行代码来运行任务。无论哪种方式,它都与将结果重新合并在一起无关。
var apiCallTasks = new List<Task<List<JObject>>>();
apiCallTasks.SelectMany(r2 => r2.Result);
    private async Task<List<int>> ReturnInts()
    {
        return new List<int> { 5 };
    }

    public async Task<List<int>> PenanceFunction()
    {
        List<Task<List<int>>> tasks = new List<Task<List<int>>>();
        tasks.Add(ReturnInts());
        tasks.Add(ReturnInts());
        List<int> myResults = new List<int>();
        await Task.WhenAll(tasks);
        foreach(var t in tasks)
        {
            myResults.AddRange(t.Result);
        }
        return myResults;
    }