[英]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.