繁体   English   中英

异步任务方法未并行运行

[英]Async Task method is not running in parallel

我有一个下面两种方法的类

public static async Task UploadReportData()
{

    List<string> input = new List<string>();

    input = getdatafromdb();

    int counter = 1;
    List<Task> tasks = new List<Task>();


    foreach (var item in input)
    {
        tasks.Add(uploadtoTable(item)); //for each input it waits here until uploadtoTable method is completed. 

        if (counter % 3 == 0)
        {
            await Task.WhenAll(tasks);
            tasks.Clear();
        }

        counter++;
    }

}

public static async Task uploadtoTable(string item)
{
    failureTableModels = //some database calls
    successTableModels = //some database calls
    List<Task> tasks = new List<Task>();

    if (failureTableModels.Count > 0)
        tasks.Add(BulkUpsertDetailedReport(failureTableModels));
    if (successTableModels.Count > 0)
        tasks.Add(BulkUpsertDetailedReport(successTableModels));

    await Task.WhenAll(tasks);
}

“ uploadtoTable”方法不会并行调用。 我希望它可以在3个线程中运行。 我在这里想念什么?

每当您使用async / await时,直到第一次等待时,方法中的所有代码将在调用线程上同步运行。 如果您希望uploadToTable能够并行执行,则可以使用

tasks.Add(Task.Run(() => uploadtoTable(item)));

然后它们可能并行运行。 附带说明的是,由于代码在第一个等待之前一直保持同步,因此使用没有等待的异步方法实际上没有任何意义。

async await并不意味着任务将在新线程上运行。 这只是意味着如果操作未完成,它将不会阻塞。 WhenAll只是将其聚合到另一个Task ,它遵循相同的模式。

然后, TaskScheduler将决定这些任务的运行方式,如果认为最佳,则可以在同一线程上同步运行。

如果希望它并行运行,可以尝试使用Parallel.ForEach ,但是请注意,这将阻止调用线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM