Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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#_Asynchronous_Async Await - Fatal编程技术网

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
我提到了一个没有等待的异步方法,来说明异步方法中直到第一次等待的所有代码都将同步运行。不是指代码的注释。