2017-02-17 62 views
1

我怎麼能採取下面的代碼,並使myValues的每次迭代異步(關於執行命令,而不是循環本身)?異步運行參數化查詢/命令?

using (var connection = new SqlConnection(CONNECTION_STRING)) 
using (var command = new SqlCommand(query, connection)) 
{ 
    connection.Open(); 
    command.Parameters.Add("@myParameter", SqlDbType.VarChar) 
    foreach(string myValue in myValues) 
    { 
     command.Parameters["@myParameter"].Value = myValue; 
     using (var dr = command.ExecuteReader(CommandBehavior.SingleResult)) 
     { 
      while (dr.Read()) 
      { 
       //do something 
      } 
     } 
    } 
} 
+1

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereaderasync(v=vs.110).aspx – David

+0

您可能希望把代碼放到一個BackgroundWorker因此您可以在發生更新時執行其他任務。 – jdweng

+1

@jdweng如果使用固有的異步IO操作完成工作,沒有理由使用BGW。這裏沒有CPU綁定的工作。 – Servy

回答

0

這是您需要的嗎?

private void MyMethod() 
{ 
    UpdateValues(); 
} 

async Task UpdateValues() 
{ 
    using (var connection = new SqlConnection("your_connection_string_here")) 
    { 
     using (var command = new SqlCommand("your_sql_statement_here", connection)) 
     { 
      await connection.OpenAsync(); 
      command.Parameters.Add("@myParameter", SqlDbType.VarChar); 

      foreach (string myValue in myValues) 
      { 
       command.Parameters["@myParameter"].Value = myValue; 

       var dr = await command.ExecuteReaderAsync(CommandBehavior.SingleResult); 
       while (await dr.ReadAsync()) 
       { 
        // do your thing here // 
       } 
      } 
     } 
    } 
} 
+0

@David,解釋原因。你的評論沒有說任何有用的東西。 (可能是異步Task) – rmszc81

+0

由於該方法無法等待,因此無法使用代碼等待或觀察操作結果。 C#even *允許*'async void'的唯一原因是爲了向後兼容舊的UI事件技術,它必須返回void。 (這對C#語言團隊來說很可能是一個痛點)。即使這樣,也需要謹慎使用*。 – David

+0

更改爲任務。 – rmszc81