Как использовать CancellationToken с клиентом очереди служебной шины Azure?

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

var messages = await queueClient.ReceiveBatchAsync(10, TimeSpan.FromSeconds(30));

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

Другими словами, я хотел бы сделать это, но я не могу:

var messages = await queueClient.ReceiveBatchAsync(10, TimeSpan.FromSeconds(30),
                                                       cancellationToken);

Как лучше всего применить CancellationToken к такой задаче, которая не предлагает ее напрямую? Я не хочу ждать все 30 секунд во время выключения.


person Matt Johnson-Pint    schedule 15.05.2014    source источник


Ответы (1)


Вероятно, вы могли бы использовать QueueClient.Abort следующим образом. :

using (cancellationToken.Register(() => queueClient.Abort())
{
    var messages = await queueClient.ReceiveBatchAsync(
        10, TimeSpan.FromSeconds(30));
    return messages; // or process it 
}
person noseratio    schedule 15.05.2014
comment
Хорошо смотрится на поверхности. Но знаете ли вы, действительно ли это прервет тайм-аут? Я должен попробовать и посмотреть. - person Matt Johnson-Pint; 15.05.2014
comment
@MattJohnson, я точно не знаю, так как я еще не использовал ReceiveBatchAsync. - person noseratio; 15.05.2014
comment
Если это не так, вы всегда можете объединить свой cancellationToken с тайм-аутом CancellationToken через CancellationTokenSource вместо использования тайм-аута в вызове QueueClient.ReceiveBytesAsync. - person Paulo Morgado; 15.05.2014
comment
Я столкнулся с этим сегодня. Это решение сработало для меня, по крайней мере, при быстрой проверке через Linqpad. OperationCanceledException возникло при отмене токена. - person David Ruttka; 28.06.2017