Как пишет Стивен, асинхронная не работает ваш код в потоке. К счастью, вы можете использовать TaskFactory.FromAsync с MessageQueue.BeginReceive /MessageQueue.EndReceive получать сообщения асинхронно:
private async Task<Message> MyAsyncReceive()
{
MessageQueue queue=new MessageQueue();
...
var message=await Task.Factory.FromAsync<Message>(
queue.BeginReceive(),
queue.EndReceive);
return message;
}
Следует отметить, однако, что не существует версия BeginReceive, которая использует транзакции. Из документов BeginReceive:
Не используйте асинхронный вызов BeginReceive с транзакциями. Если вы хотите выполнить транзакционную асинхронную операцию, вызовите BeginPeek и поместите транзакцию и (синхронный) метод Receive в обработчик событий, который вы создаете для операции peek.
Это имеет смысл, поскольку нет никакой гарантии, сколько времени вам нужно ждать ответа или какой поток в конечном итоге будет обрабатывать завершенный звонок.
Чтобы использовать транзакции можно было бы написать что-то вроде этого:
private async Task<Message> MyAsyncReceive()
{
var queue=new MessageQueue();
var message=await Task.Factory.FromAsync<Message>(queue.BeginPeek(),queue.EndPeek);
using (var tx = new MessageQueueTransaction())
{
tx.Begin();
//Someone may have taken the last message, don't wait forever
//Use a smaller timeout if the queue is local
message=queue.Receive(TimeSpan.FromSeconds(1), tx);
//Process the results inside a transaction
tx.Commit();
}
return message;
}
UPDATE
Как Роб отметил, оригинальный код используется message
вернулся из Peek
, который может быть изменен между Peek
и Receive
. В этом случае второе сообщение будет потеряно.
По-прежнему существует вероятность блокировки, если другой клиент читает последнее сообщение в очереди. Чтобы предотвратить это, Receive
должен иметь небольшой тайм-аут.
Является ли ваш код предупреждением? Вы читали то, что говорили и пытались понять их? – svick
Посмотрите в своем списке ошибок, вы увидите: «Этот асинхронный метод не использует« ждут »операторов и будет работать синхронно» –
Это не локализованный вопрос -indeed, есть много подобных вопросов в SO, где люди думают, что 'async' каким-то образом заставляет их запускать асинхронно. –