为什么不使用集线器忽略异步/等待。在最新的SignalR客户端中打开并按顺序工作?

问题描述 投票:0回答:1

我有一个与SignalR Hub(服务器)通信的.NetCore 3.1 Windows服务(客户端)。服务器发送一堆消息,这些消息应同时启动长期任务,而不阻塞主线程。为此,我在注册处理程序上使用async / await:

var subscription = _connection
                .On<Launch>(
                    Methods.Launch,
                    async (payload) => await Handler(payload)
                    );

我的处理程序看起来像:

    private async Task<bool> Handler(Payload payload)
    {
        _logger.LogInformation($"Launch STARTED | Id: {payload.Id}");
        await Task.Delay(3000);
        _logger.LogInformation($"Launch DONE | Id: {payload.Id}");
        return true;
    }

具有异步/等待功能,我正在控制台中等待类似的东西

Launch STARTED | Id: 1
Launch STARTED | Id: 2
Launch STARTED | Id: 3
Launch STARTED | Id: 4
Launch DONE | Id: 1
Launch DONE | Id: 3
Launch DONE | Id: 2
Launch DONE | Id: 4

但是得到:

Launch STARTED | Id: 1
Launch DONE | Id: 1
Launch STARTED | Id: 2
Launch DONE | Id: 2
Launch STARTED | Id: 3
Launch DONE | Id: 3
Launch STARTED | Id: 4
Launch DONE | Id: 4

[有趣的是Microsoft.AspNetCore.SignalR.Client ver1.1.0可以根据需要工作。升级到最新的Microsoft.AspNetCore.SignalR.Client ver3.1.4后,就会出现这种现象。

是否有一种方法可以在最新的SignalR.Client中实现对传入消息的“并行/非阻塞”处理?

c# .net async-await signalr.client .net-core-3.1
1个回答
0
投票

的确,这是消息调度机制的预期行为。说明涉及到:

#2084#2086,然后#5351

作为一种解决方法,我已经以另一种方式更改了代码:

var subscription = _connection
            .On<Launch>(
                Methods.Launch,
                payload => { _ = Handler(payload); } // <= here is fire-and-forget stuff
                );

现在它可以按我需要的方式工作。

© www.soinside.com 2019 - 2024. All rights reserved.