Azure 服务总线同步发送消息

Azure Service Bus send messages synchronously

我想为已经存在的应用程序实现类似监视服务的功能。该应用程序将根据主 Web 应用程序中发生的情况检查队列(Azure 服务总线)中的消息。 最近遇到的问题:从文档上看到的https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview 大多数示例都使用异步代码(这完全没问题),通常如果我使用 Entity Framework 之类的东西,我总是可以选择 _context.Save() 和 [=16] 等方法=]Async() 但不幸的是,我找不到支持同步代码的示例,而且我知道 运行 同步异步代码是一种不好的做法。我想使用同步代码的原因很简单,Web 应用程序很旧并且有很多代码,所以我可以将所有可能的方法重写为异步,但这会花费很长时间,相反我想将消息同步发送到服务总线。 我正在使用包 Azure.Messaging.ServiceBus 并且我想使用

 sender = client.CreateSender(queueName);
  await sender.SendMessagesAsync(messageBatch);

同步

服务总线客户端库不支持同步操作。为了同步使用它,您需要在您的应用程序中求助于异步同步。

采用这种设计的原因之一是客户端库使用的底层 AMQP 传输是完全异步的。要提供同步 API,SDK 客户端需要使用异步同步,这对于调用应用程序来说并不明显,并且可能会使应用程序开发人员更难调试线程池问题。

最正确的答案显然是重新编写代码库以在所有 I/O 绑定调用上遵循异步/等待模式,并通过这样做获得可伸缩性的好处。

但是,既然你说你有一个庞大的遗留代码库,如果你在 .Net Core 上,你将能够通过使用异步同步来提供伪同步重载,例如:

public static class MyServiceBusExtensions
{
    [Obsolete("TODO - convert our codebase to async")]
    public static void SendMessage(this ServiceBusSender sender, ServiceBusMessage message)
    {
        sender.SendMessageAsync(message, CancellationToken.None).Wait();
    }
}

这显然会阻塞调用者线程。