Предупреждение Visual Studio при использовании асинхронных методов Stackexchange.Redis внутри транзакции

У меня есть следующий код:

var trans = conn.CreateTransaction();
trans.StringSetAsync(keyValuePairs, flags: flags);
trans.SortedSetAddAsync(KeyForAllMessages(), messages.Select(m => new KeyValuePair<RedisValue, double>(m.id, m.id)).ToArray());
trans.SortedSetAddAsync(threadKey, messages.Select(m => new KeyValuePair<RedisValue, double>(m.id, m.id)).ToArray()).GetAwaiter();
return await trans.ExecuteAsync(flags);

Приведенный выше код находится внутри асинхронного метода с именем:

общедоступная асинхронная задача CacheMessagesAsync(....)

VS 2013 подчеркивает три команды trans.XXX и отображает предупреждение, в котором говорится:

Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрите возможность применения оператора «ожидание» к результату вызова.

Хотя последняя команда

return await trans.ExecuteAsync (флаги);

означает, что метод ожидает вышеуказанных команд. Почему я получаю предупреждение? Это как-то связано с реализацией вызовов Stackexchange.Redis Api или я что-то упускаю из виду при написании правильного кода CTP?


person PanKak    schedule 21.03.2014    source источник


Ответы (1)


Вы ожидаете только один из асинхронных методов. Вероятно, вы должны каким-то образом ожидать всех методов, чтобы остальные три завершились к тому времени, когда завершится задача, представляющая этот метод.

Если важно, чтобы каждая задача завершалась до начала следующей, просто await их всех.

Если вам просто нужно запустить их все, но все они могут выполняться параллельно, вы можете просто передать их все Task.WhenAll и дождаться этого.

person Servy    schedule 21.03.2014
comment
Спасибо за ваш быстрый ответ. Хотя обратите внимание, что, поскольку я создал транзакцию, любые методы, включающие trans.[some method], будут планироваться API асинхронно, пока я не выполню транзакцию в последней строке. Я думаю, что это может быть специфично для redis API, но я думал, что, поскольку я жду transaction.execute, это похоже на ожидание всех включенных асинхронных методов. Вы уверены, что я должен ждать их всех в конкретном коде? - person PanKak; 21.03.2014
comment
@PanKak Если вам никогда не нужно их ждать, то у них не было бы причин возвращать Task в первую очередь. - person Servy; 21.03.2014
comment
Действительно, но метод trans.ExecuteAsync(...) возвращает Task‹bool›. Итак, согласно вашей информации, я удалил async из объявления своего метода и просто возвращаю результат задачи trans.ExecuteAsync(...). Таким образом, вызывающий абонент несет ответственность за решение об ожидании или нет. Спасибо!!! - person PanKak; 21.03.2014