异步SQL查询执行 – Task.WaitAll(tasks)永远不会完成

我有一个应用程序使用异步查询执行将数据从MS SQL服务器移动到MySQL服务器; 数据移动正常,但RunAllTask​​s()方法中的Task.WaitAll(任务)调用永远不会完成。

异步任务都遵循PumpLocsAsync()的模式,其中通过BeginExecuteReader异步调用对MS SQL的调用; 当读者返回结果时,MySQL会正常插入。

..

async Task PumpLocsAsync() { using (var conn = new SqlConnection(SqlConnStr)) using (var cn = new MySqlConnection(MysqlConnStr)) using (var cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandText = "SELECT HERE"; conn.Open(); var handle = cmd.BeginExecuteReader(); await Task.Factory.FromAsync(handle, (ar) => { var rdr = cmd.EndExecuteReader(ar); var qry = @"INSERT HERE"; cn.Open(); using (var cmdm = new MySqlCommand(qry, cn)) { cmdm.CommandTimeout = MysqlCmdtimeout;   while (RetryUtility.RetryMethod(() => rdr.Read(), 3, 1000)) {  RetryUtility.RetryAction(() => cmdm.ExecuteNonQuery(), 3, 1000); } } Console.WriteLine("Finished Locs!"); cn.Close(); }); conn.Close(); } } ... void RunAllTasks() { Task[] tasks = { PumpLocsAsync(), PumpPicsAsync() }; try { Task.WaitAll(tasks); Console.WriteLine("Finished with all tasks..."); foreach (var task in tasks) { Console.WriteLine("Id: {0}, Status: {1}", task.Id, task.Status); } } .... 

你误解了如何调用Task.Factory.FromAsync() ,你传递了BeginXxx方法的结果和EndXxx方法的委托:

 var rdr = await Task.Factory.FromAsync( cmd.BeginExecuteReader, (Func)cmd.EndExecuteReader, null); 

如果你想在操作完成后做一些事情,只需将它放在这一行下面, await将确保它在正确的时间执行。