C# 异步任务方法未并行运行
我有一个有以下两种方法的类C# 异步任务方法未并行运行,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我有一个有以下两种方法的类 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
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);
}
公共静态异步任务UploadReportData()
{
列表输入=新列表();
输入=getdatafromdb();
int计数器=1;
列表任务=新列表();
foreach(输入中的变量项)
{
tasks.Add(uploadtoTable(item));//对于每个输入,它在这里等待,直到uploadtoTable方法完成。
如果(计数器%3==0)
{
等待任务。何时(任务);
任务。清除();
}
计数器++;
}
}
公共静态异步任务uploadtoTable(字符串项)
{
failureTableModels=//一些数据库调用
successTableModels=//一些数据库调用
列表任务=新列表();
如果(failureTableModels.Count>0)
添加(BulkUpsertDetailedReport(failureTableModels));
如果(successTableModels.Count>0)
添加(BulkUpsertDetailedReport(successTableModels));
等待任务。何时(任务);
}
“uploadtoTable”方法没有被并行调用。我希望它能在3个线程中运行。我这里缺少什么?
异步
等待
并不意味着任务将在新线程上运行。这只是意味着,如果操作尚未完成,它将不会阻塞whalll
只是将其聚合到另一个任务中,该任务遵循相同的模式
然后,TaskScheduler
将决定如何运行这些任务,如果它认为最好的话,可以在同一个线程上同步运行
您可以尝试并行。如果希望ForEach
并行运行,但请注意,这将阻止调用线程。无论何时使用async/await,直到第一次等待,该方法中截至该点的所有代码都将在调用线程上同步运行。如果希望uploadToTable能够并行执行,可以使用
tasks.Add(Task.Run(() => uploadtoTable(item)));
然后它们可能并行运行。需要注意的是,由于代码在第一次等待之前是同步的,因此使用不带等待的异步方法是没有意义的。如果使用wait,它的工作原理是sync@MoinulIslam你是说
uploadtoTable
方法中的wait
吗?你已经从yawnston或David Pilkington那里得到了解决方案。但是您应该阅读这篇文章,它可以让您更好地理解async/await。请注意UploadReportData
方法中的线程安全。每个等待的任务。所有(任务)
将导致线程切换(除非所有任务都已完成),这意味着可变任务
列表在线程之间共享。尽管使用模式不是并发的,但理论上线程仍有可能看到列表内部状态的缓存过时值。我不想冒险,我会使用一个lock
“拥有一个没有等待的异步方法是没有意义的。”不,两个方法都有awaits
我提到了一个没有等待的异步方法,来说明异步方法中直到第一次等待的所有代码都将同步运行。不是指代码的注释。