2017-02-17 2 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 Нет причин использовать BGW, если вы выполняете работу, используя по существу асинхронные операции ввода-вывода. Здесь нет работы с ЦП. – 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

@ Давид, объясните, почему. Ваш комментарий не говорит ничего полезного. (вместо этого может быть вместо async Task) – rmszc81

+0

Поскольку метод не может быть ожидаемым, так что нет возможности использовать код для ожидания или наблюдать за результатом операции. Единственная причина, по которой C# даже * позволяет * 'async void' была для обратной совместимости со старыми технологиями UI-событий, которые * должны * возвращать' void'. (Это, скорее всего, больной момент для команды языка C#.) И даже тогда нужно очень тщательно использовать *. – David

+0

изменен на «Задача». – rmszc81

Смежные вопросы