我有以下代码。 对连接的调用。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