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



我有以下代码。 对连接的调用。OpenAsync() 退出程序没有任何异常。 甚至不会调用调用方方法上的 final。 程序是目标.NET45 知道吗?

更新:这是使用 .等待()。 它退出没有.连接时在父代码中等待()。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;
        }
    }

所以问题是在代码中我有异步调用链,但父(主)方法不是异步的,并且没有等待导致程序在由其中一个子方法调用异步时退出。 我补充说.Wait() 从 main 方法(即同步)调用异步方法,它工作正常。

谢谢!

msdn 文档指出:

异常将通过返回的任务传播。如果 连接超时时间过后未成功连接, 返回的任务将被标记为错误,并显示异常。这 实现返回一个 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
 }

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

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

相关内容

  • 没有找到相关文章

最新更新