C # Асинхронный метод, возвращающий задачу вне оператора using - PullRequest
0 голосов
/ 08 марта 2019

У меня вопрос по поводу асинхронных методов, возврата и использования операторов, на которые я не смог найти ответ.

Наличие следующих двух блоков кода. Будут ли оба вести себя одинаково? Есть ли риск при использовании Варианта 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 сохранять соединение открытым, поскольку задача будет выполнена после того, как блок использования был оставлен.

Надеюсь, вы можете помочь с этим.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Вы звоните в ожидании, в обоих случаях вы получите результат до закрытия соединения.

2 голосов
/ 08 марта 2019

Рассмотрим следующий код:

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; 
}

Код будет продолжать ожидание, выходя из блока использования и удаляя соединение, возможно, до того, как процесс будет завершен.

Однако, как говорит Matt.G, в обоих ваших сценариях await находится внутри блока using, гарантируя, что соединение не будет установлено до завершения задачи, поэтому оба будут одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...