异步等待长函数的并发

ct5*_*845 1 c# async-await c#-5.0

我正在尝试同时处理许多任务,因为他们不需要每个人完成任务以进入下一个任务.我使用了同步过程并尝试将其变为异步.但是衡量业绩时,这两种方法采取完全相同的时间才能完成(30秒左右),我期望的异步要快...如果我1)得到了下面的正确2)了解异步是有益的(我怀疑这是问题).

public class ExpensiveTask {
 private int _seed;
 public ExpensiveTask(int seed){ _seed = seed; }
 public Process() { //TODO various things }
}

public class Controller {
 public static void main(string[] args){ 
    var program = new Controller();
    program.RunAsync(); // Runtime 36.9s
    program.Run(); // Runtime 36.6s
 }

 void Run(){
     Process(1);
     Process(2);
     Process(3);
 }

 async void RunAsync(){
      var taskList = new List<Task>();
      taskList.Add(ProcessAsync(1));
      taskList.Add(ProcessAsync(2));
      taskList.Add(ProcessAsync(3));

      await Task.WhenAll(taskList);
 }

 async Task ProcessAsync(int seed){
      var task = new ExpensiveTask(seed);

      task.Process();
 }

 void Process(int seed){
      var task = new ExpensiveTask(seed);

      task.Process();
 }
Run Code Online (Sandbox Code Playgroud)

}

Ste*_*ary 5

async不会在线程池上运行您的代码.如果要在不同的线程上执行CPU绑定代码,则需要使用Task.Run:

Task ProcessAsync(int seed){
  var task = new ExpensiveTask(seed);
  return Task.Run(() => task.Process());
}
Run Code Online (Sandbox Code Playgroud)