C# 在MVC中使用Task.WhenAll和Task.WaitAll处理昂贵的流程

C# 在MVC中使用Task.WhenAll和Task.WaitAll处理昂贵的流程,c#,asp.net-mvc,async-await,parallel-processing,C#,Asp.net Mvc,Async Await,Parallel Processing,我正在考虑一种处理复杂而昂贵的过程的方法,这需要我打电话从多个工业领域获取多个数据。因此,对于每一项职业,我都会在generatereport类中把它们变成一个单独的任务。我想问一下,当使用任务时,任务1、任务2、任务3何时会一起运行,而不必等待任务1完成。但是如果使用Task.WaitAll它将等待MiningSector完成,以便运行ChemicalSector。我是对的,因为这是我想要实现的 public static async Task<bool> GenerateRepo

我正在考虑一种处理复杂而昂贵的过程的方法,这需要我打电话从多个工业领域获取多个数据。因此,对于每一项职业,我都会在
generatereport
类中把它们变成一个单独的任务。我想问一下,当使用
任务时,
任务1、任务2、任务3
何时会一起运行,而不必等待
任务1
完成。但是如果使用
Task.WaitAll
它将等待
MiningSector
完成,以便运行
ChemicalSector
。我是对的,因为这是我想要实现的

public static async Task<bool> GenerateReport()
       {
           static async Task<string> WriteText(string name)
           {
               var start = DateTime.Now;
               Console.WriteLine("Enter {0}, {1}", name, start);
               return name;
           }
           static async Task MiningSector()
           {
               var task1 = WriteText("task1");
               var task2 = WriteText("task2");
               var task3 = WriteText("task3");
 
               await Task.WhenAll(task1, task2, task3); //Run All 3 task together
 
               Console.WriteLine("MiningSectorresults: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
           }
           static async Task ChemicalsSector()
           {
               var task4 = WriteText("task4");
               var task5 = WriteText("task5");
               var task6 = WriteText("task6");
 
               await Task.WhenAll(task4 , task5 , task6 ); //Run All 3 task together
 
               Console.WriteLine("ChemicalsSectorresults: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
           }
           static void Main(string[] args)
           {
               Task.WaitAll(MiningSector(), ChemicalsSector()); //Wait when MiningSectoris complete then start ChemicalsSector.
           }
           return true;
       }

公共静态异步任务生成器报告()
{
静态异步任务WriteText(字符串名称)
{
var start=DateTime.Now;
WriteLine(“输入{0},{1}”,名称,开始);
返回名称;
}
静态异步任务挖掘扇区()
{
var task1=WriteText(“task1”);
var task2=WriteText(“task2”);
var task3=WriteText(“task3”);
等待任务。WhenAll(task1、task2、task3);//同时运行所有3个任务
WriteLine(“MiningSectorresults:{0}”,String.Join(“,”,t1.Result,t2.Result,t3.Result));
}
静态异步任务chemicalsector()
{
var task4=WriteText(“task4”);
var task5=WriteText(“task5”);
var task6=WriteText(“task6”);
等待任务。WhenAll(任务4、任务5、任务6);//同时运行所有3个任务
WriteLine(“chemicalsectorresults:{0}”,String.Join(“,”,t1.Result,t2.Result,t3.Result));
}
静态void Main(字符串[]参数)
{
Task.WaitAll(MiningSector(),chemicalsector());//当MiningSector完成时等待,然后启动chemicalsector。
}
返回true;
}
我想实现的是,MiningSector内部有10个或更多功能需要运行,ChemicalSector也一样。我想并行运行MiningSector中的所有函数一旦完成,ChemicalSector将开始运行该函数

但如果使用Task.WaitAll,它将等待MiningSector完成以运行ChemicalSector。我是对的,因为这是我想要实现的

public static async Task<bool> GenerateReport()
       {
           static async Task<string> WriteText(string name)
           {
               var start = DateTime.Now;
               Console.WriteLine("Enter {0}, {1}", name, start);
               return name;
           }
           static async Task MiningSector()
           {
               var task1 = WriteText("task1");
               var task2 = WriteText("task2");
               var task3 = WriteText("task3");
 
               await Task.WhenAll(task1, task2, task3); //Run All 3 task together
 
               Console.WriteLine("MiningSectorresults: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
           }
           static async Task ChemicalsSector()
           {
               var task4 = WriteText("task4");
               var task5 = WriteText("task5");
               var task6 = WriteText("task6");
 
               await Task.WhenAll(task4 , task5 , task6 ); //Run All 3 task together
 
               Console.WriteLine("ChemicalsSectorresults: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
           }
           static void Main(string[] args)
           {
               Task.WaitAll(MiningSector(), ChemicalsSector()); //Wait when MiningSectoris complete then start ChemicalsSector.
           }
           return true;
       }

不需要。这里要理解的关键是先计算参数,然后计算方法调用。这与所有参数和方法调用在整个C#语言中的工作方式相同

所以这个代码:

Task.WaitAll(MiningSector(), ChemicalsSector());
var miningTask = MiningSector();
var sectorTask = ChemicalsSector();
Task.WaitAll(miningTask, sectorTask);
具有与此代码相同的语义:

Task.WaitAll(MiningSector(), ChemicalsSector());
var miningTask = MiningSector();
var sectorTask = ChemicalsSector();
Task.WaitAll(miningTask, sectorTask);
换句话说,在调用
Task.WaitAll
之前,调用这两个方法(并启动这两个任务)

如果你想先做一个,然后再做另一个,那么在第一个任务完成之前不要调用第二个方法。使用
async Main
最容易做到这一点,例如:

static async Task Main(string[] args)
{
  await MiningSector();
  await ChemicalsSector();
}

这回答了你的问题吗@我问约翰·巴克利,我的思维方式正确与否,我知道韦塔尔和惠纳尔。我只是不确定它是否会达到我想要的结果。这是否清楚?更新了问题,让您再次阅读,
WaitAll
并不意味着它关心任务的执行顺序。它们都做相同的事情,但主要区别在于
WaitAll
阻止主线程单元所有已完成的任务,但
当所有的
not do和主线程可以处理其他任务时。您发布的代码将同步运行,因为没有发生任何异步。如果
WriteText
是一种真正的异步方法,即涉及到的i/O,那么
task2
将在线程释放时开始,而不会等待
task1
完成。