异步方法中的同步操作-如何解决未正确正确输出的结果?

问题描述

在此示例中。当我在控制台中运行此程序时,我的MyList属性中没有任何内容,因此屏幕上没有任何显示。但是,如果添加断点,则可以在列表中得到预期的内容。可能是因为填充MyList的方法异步方法,而添加到列表的过程是同步方法?您将如何更改此代码,以便在程序运行时始终填充MyList?

namespace ReceiverApp
{

    static class Program
    {
        public static List<string> MyList { get; set; }

        const string ServiceBusConnectionString = "Endpoint=sb://...";
        const string QueueName = "...";
        static IQueueClient queueClient;

        static void Main(string[] args)
        {
            MyList = new List<string>();
            MainAsync().GetAwaiter().GetResult();

            foreach (var item in MyList)
            {
                Console.WriteLine(item);
            }
        }

        static async Task MainAsync()
        {
            
            queueClient = new QueueClient(ServiceBusConnectionString,QueueName);

            RegisterOnMessageHandlerAndReceiveMessages();

            await queueClient.CloseAsync();
        }

        static void RegisterOnMessageHandlerAndReceiveMessages()
        {
            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
            {
                MaxConcurrentCalls = 1,AutoComplete = false
            };

            queueClient.RegisterMessageHandler(ProcessMessagesAsync,messageHandlerOptions);
        }

        static async Task ProcessMessagesAsync(Message message,CancellationToken token)
        {
            // Process the message
            MyList.Add(Encoding.UTF8.GetString(message.Body));
            //await queueClient.CompleteAsync(message.SystemProperties.LockToken);
        }

        static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs args)
        {
            Console.WriteLine($"Message handler encountered an exception {args.Exception}.");
            return Task.CompletedTask;
        }
    }
}

解决方法

您正在将用于连续接收消息的代码与短暂且立即结束的控制台应用程序混合在一起。如果在调用处理程序的注册后设置延迟,则会看到填充的消息。但这是一个错误的实现。如果您希望以一种受控的方式接收消息,则不应使用消息处理程序,而应使用消息接收器。

此外,关闭队列客户端将终止与代理的连接并阻止消息接收。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...