1

我有一个ServiceBusClient类,它创建一个QueueClient用于在公共汽车上收听消息的类。我查看了以下文章来进行设置:

后台任务(微软)

托管服务(微软)

异步和等待

我的ServiceBusClient类处理QueueClient看起来像这样:

public class ServiceBusClient : IServiceBusClient
{
    public ServiceBusClient(IEventService eventService, ServiceBusClientOptions options)
    {
        ...
        queueClient = new QueueClient(options.ConnectionString, options.QueueName);
    }

    public void Run()
    {
        RegisterOnMessageHandler();
    }

    private void RegisterOnMessageHandler()
    {
        ...
        queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
    }

    private async Task ProcessMessagesAsync(Message message, CancellationToken token)
    {
        var eventMessage = EventMessage.FromMessage(message);

        await eventService.Write(eventMessage);

        if (!token.IsCancellationRequested)
        {
            await queueClient.CompleteAsync(message.SystemProperties.LockToken);
        }
    }

    private Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
    {
        // log errors
        ...

        return Task.CompletedTask;
    }  
}

我希望从一个IHostedService甚至通过扩展BackgroundService. 在我发现的示例中,工作不断在一个不适合我的场景的 while 循环中执行,因为我只尝试运行一个命令。

所以我创建了一个超级简单的实现,如下所示:

protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
    serviceBusClient.Run();

    while (!cancellationToken.IsCancellationRequested)
    {
        // empty loop to keep running for lifetime of pod       
    }
}

如果删除async我显然需要返回一些东西。我试过Task.CompletedTask了,但这需要我将返回类型更改为Task<Task>.

如果我有适当的async位置,我将需要await一些东西,但我不确定是什么。

这感觉不对。ServiceBusClient我认为我需要更改ProcessMessagesAsync.

我想要的只是让我的网络应用程序开始监听消息,直到它死掉。我怎样才能做到这一点?

4

1 回答 1

3

我放弃了使用BackgroundServiceIHostedService改为实施。

    public class MessageListenerService : IHostedService
    {
        private readonly IServiceBusClient client;
        private readonly ITelemetryClient applicationInsights;

        public MessageListenerService(IServiceProvider serviceProvider)
        {
            client = serviceProvider.GetService<IServiceBusClient>();
            applicationInsights = serviceProvider.GetService<ITelemetryClient>();
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            applicationInsights.TrackTrace(new TraceTelemetry("MessageListenerService is starting"));

            client.Run();

            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            applicationInsights.TrackTrace(new TraceTelemetry("MessageListenerService is stopping"));
            return client.Stop();
        }
    }

如果您发现此代码有问题,请在评论中告诉我,我会酌情更新。

最后我们还是为它创建了一个控制台应用程序。

于 2019-08-20T10:27:06.587 回答