亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ASB MessageReceiver ReceiveAsync 崩潰

ASB MessageReceiver ReceiveAsync 崩潰

C#
慕村9548890 2021-08-22 15:22:39
環境Windows 10 專業版.NET Core 控制臺應用程序代碼我有一個看起來像這樣的抽象消息接收器。在此代碼中,entity是Subscription(例如user)的名稱。public class AzureMessageReceiver : ITdlMessageReceiver{    private readonly ServiceBusConnection serviceBusConnection;    private readonly ILogger<AzureMessageReceiver> logger;    public AzureMessageReceiver(ServiceBusConnection serviceBusConnection, ILogger<AzureMessageReceiver> logger)    {        this.serviceBusConnection = serviceBusConnection;        this.logger = logger;    }    public async Task<TdlMessage<T>> ReceiveAsync<T>(string topic, string entity) where T : class    {        try        {            var subscriptionPath = EntityNameHelper.FormatSubscriptionPath(topic, entity);            var messageReceiver = new MessageReceiver(serviceBusConnection, subscriptionPath, ReceiveMode.ReceiveAndDelete);            var message = await messageReceiver.ReceiveAsync();            if (message == null)            {                return null;            }            var messageString = Encoding.UTF8.GetString(message.Body);            return JsonConvert.DeserializeObject<TdlMessage<T>>(messageString);        }        catch (Exception ex)        {            logger.LogError(ex, "Error receiving Azure message.");            return null;        }    }}注入ServiceBusConnection的構造是這樣的。注:此相同的連接的初始化工作,以寫郵件到同Topic和Subscription。services.AddSingleton(serviceProvider =>    new ServiceBusConnection(configuration[$"{DurableCommunicationKey}:AzureConnectionString"]));問題每次我執行這一行時,var message = await messageReceiver.ReceiveAsync();它都會使控制臺應用程序崩潰。沒有Exception,也沒有Event Viewer。我試過的使用Secondary Connection String來自 ASB提供超時,如 messageReceiver.ReceiveAsync(TimeSpan.FromMinutes(1));將注入的內容topic從主題名稱更改為主題的整個 URL(例如https://{...}.servicebus.windows.net/{topicName})更改ReceiveMode為PeekLock后跟蹤ConfigureAwait(false)到ReceiveAsync的呼叫。將超時更改為TimeSpan.Zero. 注意:這并沒有崩潰的應用程序,但實際上拋出Exception該得到記錄。
查看完整描述

1 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

async void應該轉換為 anasync Task以及您應該等待Task.Delay而不是調用Thread.Sleep. 如果要異步,則需要一直異步


static async Task Receive(ITdlMessageReceiver receiver, ILogger logger) {

    while (true) {

        var message = await receiver.ReceiveAsync<TdlMessage<object>>(topic, entity);

        if (message != null) {

            logger.LogDebug($"Message received. Topic: {topic}. Action: {Enum.GetName(typeof(TopicActions), message.Action)}. Message: {JsonConvert.SerializeObject(message)}.");    

        }    

        await Task.Delay(sleepTime);

    }

}

嘗試使代碼一直異步,是的,但是作為控制臺應用程序(單線程),您將被允許調用Wait()該Receive方法,Main因為它不會混合調用會導致異步流出現問題。


public static void Main(string[] args) {


    //...

    //...

    //...



    Receive(receiver, logger).Wait();

}


查看完整回答
反對 回復 2021-08-22
  • 1 回答
  • 0 關注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號