我有以下代码。对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;
}
}
答案 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