2014-02-13 17 views
3

У меня есть следующий код. вызов connection.OpenAsync() завершает работу без каких-либо исключений. Даже в конечном итоге метод вызывающего абонента не вызывается. программа нацелена на .NET45. Любая идея?SqlConnection.OpenAsync() завершает работу без исключения исключения

Обновление: Вот родительский код, который работает с .Wait(). Он завершает работу без .Wait() в родительском коде, когда connection.OpenAsync() вызывается в дочернем методе ниже.

 static void Main(string[] args) 
     { 
      UpdateSqlDatabase updateSqlDatabase = new UpdateSqlDatabase(args); 
      updateSqlDatabase.UpdateDatabaseSchemaAsync().Wait(); 
     } 

После серии метод асинхронной называет:

public async Task<T> ExecuteQueryAsync<T>(string connectionString, string commandText, IDictionary<string, object> parameters, Func<SqlDataReader, T> rowMapFunc) 
    { 
     using (var connection = new SqlConnection(connectionString)) 
     { 
      try 
      { 
       await connection.OpenAsync(); 
      } 
      catch (Exception ex) 
      { 
      } 

      SqlCommand command = connection.CreateCommand(); 
      command.CommandType = CommandType.Text; 
      command.CommandText = commandText; 
      if (parameters != null) 
      { 
       foreach (var item in parameters) 
       { 
        command.Parameters.AddWithValue(item.Key, item.Value); 
       } 
      } 

      SqlDataReader reader = await command.ExecuteReaderAsync(); 
      T retObj = default(T); 

      while (await reader.ReadAsync()) 
      { 
       retObj = rowMapFunc(reader); 
      } 

      return retObj; 
     } 
    } 
+0

Не делай этого: 'поймать (Exception) {}', вы снимаете себе в ногу. Каковы детали исключения, в конце концов? – Noseratio

+0

, когда я отлаживаю код, никогда не доходит. Я добавил, что поймать, чтобы узнать, что было не так (не будет частью моего кода). По сути, я отлаживаю выполнение соединения. OpenAsync() просто завершает работу программы. то есть консольное приложение просто завершает работу без каких-либо ошибок/исключений. Блок catch никогда не попадает в этот код. – ksj

+0

Изменить свой код следующим образом: http://pastebin.com/ZmsA3k4g. Установите точку останова на строках «A», «B», «C», «D» и запустите под отладчиком. Какие точки останова попадают? – Noseratio

ответ

0

Возможно метод OpenAsync() звонит Enviroment.FailFast(), что приведет либо, наконец, блоки не исполнять. Это использование регистрируется в журнале событий, поэтому вы должны проверить, есть ли там что-либо.

Для получения более подробной информации обратитесь к следующему http://msdn.microsoft.com/en-us/library/ms131100(v=vs.110).aspx

2

Так что вопрос в том, что в коде я имел цепь асинхронных вызовов, но родитель (основной) метод не был асинхронным и не было ждать чего программы когда Async вызывается одним из дочерних методов. Я добавил .Wait() для вызова метода async из основного метода (который является синхронизацией), и он работал нормально.

Спасибо!

+1

Наличие '.Wait()' в корне асинхронной цепи почти никогда не является правильной вещью и может часто заставлять вашу программу запираться в тупике! Либо вы должны написать свой код без async, либо функция, которая вызывает 'Wait()', должна быть асинхронной и 'await' в задаче вместо' .Wait() 'на ней. Если бы вы могли, обновите свой вопрос и покажите начальную функцию, которую вы добавили '.Wait()', мы можем помочь вам определить, какой вариант будет правильным. –

+0

Хорошо, из кода, который вы добавили, вы находитесь на стороне «Не использовать Async». Вы используете консольное приложение, нет причин использовать асинхронный код. Все, что он делает, это добавление накладных расходов и замедление вашего кода. Посмотрите, есть ли версия 'updateSqlDatabase.UpdateDatabaseSchema()' этой функции, вы должны использовать ее вместо этого в своей ситуации. –

+0

Я добавил код в исходное сообщение. Спасибо за вашу помощь. – ksj

1

В msdn documentation состоянии это:

Исключение будет распространяться через возвращенную задачу. Если время ожидания соединения истекает без успешного соединения, возвращается Задача будет отмечена как ошибочная с Исключением. Реализация возвращает Задачу без блокировки вызывающего потока для как объединенных, так и не объединенных соединений.

Таким образом, правильное использование connection.OpenAsync() скорее будет выглядеть примерно так

using(var connection = new SqlConnection(connectionString)) 
{ 
    var connectionTask = connection.OpenAsync(); 
    // other code goes here 
    Task.WaitAll(connectionTask); //make sure the task is completed 
    if(connectionTask.IsFaulted) // in case of failure 
    { 
     throw new Exception("Connection failure", connectionTask.Exception); 
    } 
    // rest of the code 
} 
Смежные вопросы