当你在C#任务awaiter上调用`OnCompleted()`时,你如何等待OnCompleted调用中给出的新作业?

我的Controller对象使用Renci.SshNet通过SSH调用MySQL数据库,因为我连接到几个DB,我转向multithreading,函数af.FetchAll()返回一个DataSet ,所有这些都被添加到一个列表DataList ,然后我要求完成所有任务,然后我将我的DataList给writer对象以将其保存到CSV文件,问题是: awaiter.OnCompleted(() =>..etc内部的代码仍在更新尽管我要求任务完成foreach (Task t in taskList) t.Wait();器试图访问它时的DataList ,我怎样才能确保awaiter在继续执行之前完成执行并写入’ DataList’到文件

  public void Query() { List QueriesList = quryValLister.GetQueriesList(); List ConnectionsList = concValLister.GetConnectionList(); // iterating over servers List taskList = new List(); foreach (ConnectionValues obj in ConnectionsList) { Controller af = new Controller(obj, QueriesList); Task taskDataResult = Task.Run (() => af.FetchAll()); taskList.Add(taskDataResult); var awaiter = taskDataResult.GetAwaiter(); awaiter.OnCompleted(() => { DataSet temp = awaiter.GetResult(); if (temp != null) { MyDataList.Add(temp); } }); } foreach (Task t in taskList) t.Wait(); } 

您不应该在常规代码中使用GetAwaiter

如果要异步写入,可以执行以下操作:

 public Task QueryAsync() { List QueriesList = quryValLister.GetQueriesList(); List ConnectionsList = concValLister.GetConnectionList(); // iterating over servers var tasks = ConnectionsList .Select(obj => Task.Run(() => new Controller(obj, QueriesList).FetchAll())); MyDataList.AddRange(await Task.WhenAll(tasks)); } 

或者,如果要同步编写它:

 public void Query() { List QueriesList = quryValLister.GetQueriesList(); List ConnectionsList = concValLister.GetConnectionList(); // iterating over servers var tasks = ConnectionsList .Select(obj => Task.Run(() => new Controller(obj, QueriesList).FetchAll())) .ToArray(); Task.WaitAll(tasks); foreach (var task in tasks) MyDataList.Add(task.Result); } 

请注意,同步版本中的error handling是不同的; exception包含在AggregateException