Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 等待任务列表而不阻止另一个任务列表_C#_.net_Async Await_Task_Latency - Fatal编程技术网

C# 等待任务列表而不阻止另一个任务列表

C# 等待任务列表而不阻止另一个任务列表,c#,.net,async-await,task,latency,C#,.net,Async Await,Task,Latency,我正在编写一段代码,从一个源获取数据,进行一些处理,然后将其保存到另一个源。由于两端都有很高的延迟,我尝试使用async/await来等待加载和保存操作完成。理想情况下,这将启动所有输入任务,当每个任务完成时,它会执行一些快速处理,然后启动输出任务-使用task.WaitAll将导致程序在新任务可以启动时不执行任何操作 因为第二个异步任务取决于第一个任务的结果,所以我不知道如何处理第二个等待,让它恢复处理第一个等待的其他结果-一旦处理了结果,第二个等待被命中,它会完全阻塞,直到完成保存功能,而不

我正在编写一段代码,从一个源获取数据,进行一些处理,然后将其保存到另一个源。由于两端都有很高的延迟,我尝试使用async/await来等待加载和保存操作完成。理想情况下,这将启动所有输入任务,当每个任务完成时,它会执行一些快速处理,然后启动输出任务-使用task.WaitAll将导致程序在新任务可以启动时不执行任何操作

因为第二个异步任务取决于第一个任务的结果,所以我不知道如何处理第二个等待,让它恢复处理第一个等待的其他结果-一旦处理了结果,第二个等待被命中,它会完全阻塞,直到完成保存功能,而不是继续处理其他结果。我在尝试这样的事情,我做错了什么

async Task MainAsync()
{
    /* gets a list of id's */

    var dataRequests = ids.Select(id => LoadEntryById(id)).ToList();

    foreach(var request in dataRequests)
    {
        RawEntry response = await request;

        ProcessedEntry result = doSomething(response);

        await SaveResult(result);
    }
}

async Task<RawEntry> LoadEntryById(int id)
{
    /* IO task */
}

async Task SaveResult(ProcessedEntry result)
{
    /* IO task */
}

不要等待单个方法,而是使用延续创建列表,然后使用Task.Whalll:


这将以异步方式处理所有任务。

不要等待单个方法,而是使用继续创建列表,然后使用任务。所有:


这将以异步方式处理您的所有任务。

如果我理解正确,您可以尝试以下方法:

Parallel.Foreach( ids.Select(id => LoadEntryById(id)), (rawEntry) => {
    var result = doSomething(rawEntry);

    await SaveResult(result);
}

RawEntry LoadEntryById(int id)
{
    /* IO task */
}

async Task SaveResult(ProcessedEntry result)
{
    /* IO task */
}

在此设置中,LoadEntryById不需要返回任务,但这取决于它正在执行的操作。

如果我理解正确,您可以尝试以下操作:

Parallel.Foreach( ids.Select(id => LoadEntryById(id)), (rawEntry) => {
    var result = doSomething(rawEntry);

    await SaveResult(result);
}

RawEntry LoadEntryById(int id)
{
    /* IO task */
}

async Task SaveResult(ProcessedEntry result)
{
    /* IO task */
}

在此设置中,LoadEntryById不需要返回任务,但它取决于它正在执行的操作。

只是不等待SaveResult?把它放到列表中,最后等待所有的请求。没有理由等待请求,因为请求已经被定义并且有它的数据。第5行获取此时的所有数据并将其加载到列表中。foreach然后从列表中获取每一项。@John Rasch-我对异步内容无论如何都不是专家,但目前只有在LoadEntryById…ToList完成后才能访问foreach。到该点的代码是同步的。第一个“等待”应该在第5行,并且应该使用ToListSyncJust don't Wait SaveResult?把它放到列表中,最后等待所有的请求。没有理由等待请求,因为请求已经被定义并且有它的数据。第5行获取此时的所有数据并将其加载到列表中。foreach然后从列表中获取每一项。@John Rasch-我对异步内容无论如何都不是专家,但目前只有在LoadEntryById…ToList完成后才能访问foreach。到该点的代码是同步的。第一个“等待”应该在第5行,并且应该使用ToListSync