问题描述
在此示例中。当我在控制台中运行此程序时,我的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;
}
}
}
解决方法
您正在将用于连续接收消息的代码与短暂且立即结束的控制台应用程序混合在一起。如果在调用处理程序的注册后设置延迟,则会看到填充的消息。但这是一个错误的实现。如果您希望以一种受控的方式接收消息,则不应使用消息处理程序,而应使用消息接收器。
此外,关闭队列客户端将终止与代理的连接并阻止消息接收。