我有一个服务,它使用MessageReceiverfromMicrosoft.Azure.ServiceBus连续收听 ServiceBus 中的订阅。当服务停止时,我想在进程被终止之前给所有操作完成的机会。
这是我根据库提供的示例使用的代码:
private async Task StartReceiveLoop(IMessageReceiver receiver, CancellationToken cancellationToken)
{
var doneReceiving = new TaskCompletionSource<bool>();
cancellationToken.Register(() =>
{
receiver.CloseAsync();
doneReceiving.SetResult(true);
});
receiver.RegisterMessageHandler(
async (message, ct) => await HandleMessage(receiver, message),
new MessageHandlerOptions(HandleException));
await doneReceiving.Task;
}
在服务停止时,我取消了任务,即使服务HandleMessage仍在运行,它也会立即被终止。
有什么方法可以通过库本身检查操作是否仍在运行以延迟任务取消?我可以想到一种通过锁定所有正在运行的任务来进行自己计数的方法,但我希望有一种更好的方法可以让我知道正在运行的处理程序的数量。
理想情况下,我想取消注册处理程序,以便消息泵停止,而接收器本身不会关闭以允许例如 CompleteAsync 调用。
一只萌萌小番薯
开满天机
相关分类