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

ksj*_*ksj 5 c# asynchronous sqlconnection async-await

我有以下代码。对 connection.OpenAsync() 的调用会毫无例外地退出程序。甚至调用方方法上的 finally 也不会被调用。程序针对.NET45 知道吗?

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

        static void Main(string[] args)
        {
            UpdateSqlDatabase updateSqlDatabase = new UpdateSqlDatabase(args);
            updateSqlDatabase.UpdateDatabaseSchemaAsync().Wait();
        }
Run Code Online (Sandbox Code Playgroud)

在一系列异步方法调用之后:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jos*_*son 0

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

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