2012-04-22 29 views
2

私は、非同期クエリの実行を使用して、MS SQLサーバーからMySQLサーバーにデータを移動するアプリケーションを持っています。データは正常に動作しますが、RunAllTask​​s()メソッドのTask.WaitAll(タスク)呼び出しは完了しません。非同期SQLクエリの実行 - Task.WaitAll(tasks)が完了しない

非同期タスクはすべて、BeginExecuteReaderを介してMS SQLの呼び出しが非同期に呼び出されるPumpLocsAsync()のパターンに従います。読者が結果を返すと、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; 
        <PARAM SETUP HERE> 
        <COLUMN MAPPING HERE> 

        while (RetryUtility.RetryMethod<bool>(() => rdr.Read(), 3, 1000)) 
        { 
         <LOADING PARAMS WITH BITS HERE> 
         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); 
       } 
      } 

.... 

答えて

7

あなたは誤解Task.Factory.FromAsync()を呼び出す方法を、あなたがそれにBeginXxx方法の結果とEndXxxメソッドにデリゲートを渡す:あなたがしたい場合は

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

何か操作が完了した後、単にこの行の下に置くと、awaitは適切なタイミングで実行されることを確認します。

+0

これはどういう意味ですか? var rdr =待ち行列Task.Factory.FromAsync(cmd.BeginExecuteReader( 、(Func )cmd.EndExecuteReader); – dr3x

+0

これは_答えです... – MoonKnight

+0

@ dr3x、ええ、あなたは正しいです。 – svick

関連する問題