2012-04-22 1 views
2

비동기 쿼리 실행을 사용하여 MS SQL 서버에서 MySQL 서버로 데이터를 이동할 수있는 앱이 있습니다. 데이터가 잘 움직이지만 Task.WaitAll (작업)은 RunAllTasks() 메서드를 호출하지 않고 완료됩니다.비동기 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

이것은 _is_ 대답입니다 ... – MoonKnight

+0

@ dr3x, 네, 맞아요. – svick