C#异步方法在使用语句之外返回任务

时间:2019-03-08 14:17:39

标签: c# asynchronous

我对异步方法,返回和使用我找不到答案的语句有疑问。

具有以下两个代码块。两者的行为方式是否相同?使用选项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块之后任务将完成。

希望您可以提供帮助。

谢谢!

2 个答案:

答案 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,在两种情况下,您都将在连接关闭之前检索结果。