Я кодировал решение, которое искал, вот базовая схема c:
внутри асинхронного метода (запускает собственный поток)
public async Task InitialiseAndRunMessageReceiver()
запускаем бесконечный l oop, который читает сообщение
receiver = new MessageReceiver(serviceBusConnectionString, serviceBusQueueName, ReceiveMode.PeekLock);
while (true) { var message = await receiver.ReceiveAsync(); ... more code... }
, как только вы знаете, что собираетесь запустить длинное задание, отложите сообщение, но сохраните message.SystemProperties.SequenceNumber
. это удерживает его в очереди, но предотвращает повторную доставку.
await receiver.DeferAsync(message.SystemProperties.LockToken);
и, когда вы, наконец, закончили, снова запросите сообщение, используя message.SystemProperties.SequenceNumber
, и завершите сообщение, как если бы оно не было deferred
var message = receiver.ReceiveDeferredMessageAsync(message.SystemProperties.SequenceNumber);
receiver.CompleteAsync(message.Result.SystemProperties.LockToken);
, и ваше сообщение будет удалено из очереди.
большая часть моей путаницы была вызвана тем, что библиотеки были названы аналогично с перекрывающимися временами жизни.
Microsoft.Azure.ServiceBus.Core.MessageReceiver
получатель сообщения выше