我想為已經存在的應用程式實作類似監控服務的功能。應用程式將根據主 Web 應用程式中發生的情況檢查佇列(Azure 服務總線)中的訊息。我最近遇到的問題:從我在檔案中看到的https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview 大多數示例都使用異步代碼(這完全沒問題),通常如果我使用諸如物體框架之類的東西,我總是可以選擇在 _context.Save() 和 _context.SaveAsync() 等方法之間進行選擇,但不幸的是我找不到支持同步代碼的示例,我知道同步運行異步代碼是一種不好的做法。我想使用同步代碼的原因很簡單,Web 應用程式很舊并且有很多代碼,所以我可以將所有可能的方法重寫為異步,但這需要很長時間,相反,我想將訊息同步發送到服務總線。我正在使用 Azure.Messaging.ServiceBus 包,我想使用
sender = client.CreateSender(queueName);
await sender.SendMessagesAsync(messageBatch);
同步
uj5u.com熱心網友回復:
服務總線客戶端庫不支持同步操作。為了同步使用它,您需要在應用程式中使用異步同步。
這種設計的原因之一是客戶端庫使用的底層 AMQP 傳輸是完全異步的。為了提供同步 API,SDK 客戶端需要使用異步同步,這對呼叫應用程式來說并不明顯,并且可能會使應用程式開發人員更難除錯執行緒池問題。
uj5u.com熱心網友回復:
最正確的答案顯然是重新撰寫代碼庫,以在所有 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();
}
}
這顯然會阻塞呼叫者執行緒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329467.html
