SqlConnection.OpenAsync()退出而不抛出异常

时间:2014-02-13 02:47:00

标签: c# asynchronous async-await sqlconnection

我有以下代码。对connection.OpenAsync()的调用退出程序,没有任何异常。即使是最后一个调用者方法也没有被调用。程序针对.NET45任何想法?

更新:这是与.Wait()一起使用的父代码。当在下面的子方法中调用connection.OpenAsync()时,它在父代码中没有.Wait()退出。

        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;
        }
    }

3 个答案:

答案 0 :(得分:2)

所以问题是在代码中我有异步调用链但是父(main)方法不是异步的并且没有等待导致程序在其中一个子方法调用Async时退出。我将.Wait()添加到main方法(同步)对异步方法的调用中,并且运行正常。

谢谢!

答案 1 :(得分:2)

msdn documentation说明了这一点:

  

异常将通过返回的Task传播。如果   连接超时时间过去没有成功连接,   返回的任务将被标记为出现异常故障。该   实现返回一个Task而不阻塞调用线程   汇集和非汇集联系。

因此,正确使用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
 }

答案 2 :(得分:0)

OpenAsync()方法可能正在调用Enviroment.FailFast(),这将导致任何finally块无法执行。此用法会记录到事件日志中,因此您应该能够检查是否有任何内容。

有关详细信息,请参阅以下内容 http://msdn.microsoft.com/en-us/library/ms131100(v=vs.110).aspx