我对异步方法,返回和使用我找不到答案的语句有疑问。
具有以下两个代码块。两者的行为方式是否相同?使用选项1有任何风险吗?
选项1:
public async Task<IEnumerable<Devices>> GetPreviousDevicesAsync(string token)
{
IEnumerable<Devices> devices;
using (var connection = _dbConnectionFactory.CreateConnection())
{
devices = await connection.FindAsync<Devices>(statement => statement
.Where($"{nameof(Devices.Token)} = '{token}');
}
return devices;
}
选项2:
public async Task<IEnumerable<Devices>> GetPreviousDevicesAsync(string token)
{
IEnumerable<Devices> devices;
using (var connection = _dbConnectionFactory.CreateConnection())
{
devices = await connection.FindAsync<Devices>(statement => statement
.Where($"{nameof(Devices.Token)} = '{token}');
return devices;
}
}
我想知道选项1代码块是否可以以某种方式保持连接打开,因为在离开了use块之后任务将完成。
希望您可以提供帮助。
谢谢!
答案 0 :(得分:2)
考虑以下代码:
public async Task<IEnumerable<Devices>> GetPreviousDevicesAsync(string token)
{
Task<IEnumerable<Devices>> deviceTask;
using (var connection = _dbConnectionFactory.CreateConnection())
{
deviceTask = connection.FindAsync<Devices>(statement => statement
.Where($"{nameof(Devices.Token)} = '{token}');
}
return await deviceTask;
}
代码将继续等待,可能在过程完成之前退出using块并释放连接。
但是,正如Matt.G所说,在两种情况下,await
都位于using
块中,请确保在任务完成之前不释放连接,因此两者将是相同的。
答案 1 :(得分:2)
您正在呼叫await,在两种情况下,您都将在连接关闭之前检索结果。