【发布时间】:2022-01-06 11:56:43
【问题描述】:
如何仅通过一个连接并行发送多条 SignalR 消息?
我有以下集线器方法:
public async Task Test()
{
Console.WriteLine($"Start: {DateTime.Now}");
await Task.Run(() => Task.Delay(1000));
Console.WriteLine($"Stop: {DateTime.Now}");
}
在我的客户端中,我有以下连接:
private connection: HubConnection = new HubConnectionBuilder()
.withUrl(this.url)
.configureLogging(LogLevel.Information)
.withAutomaticReconnect([1000, 2000, 3000, 4000, 5000])
.build();
我这样调用 hub 方法:
async test(): Promise<void> {
try {
console.log('start: ' + new Date().toString());
await this.connection.invoke('Test');
console.log('stop: ' + new Date().toString());
} catch (err) {
console.error(err);
}
}
当我在客户端中多次调用测试方法时,集线器会一个接一个地接收消息,而不是一次接收所有消息。
客户端日志:
开始时间:2021 年 11 月 29 日星期一 17:27:35 GMT+0100 (3)
停止:2021 年 11 月 29 日星期一 17:27:36 GMT+0100
停止:2021 年 11 月 29 日星期一 17:27:37 GMT+0100
停止:2021 年 11 月 29 日星期一 17:27:38 GMT+0100
服务器日志:
开始:29.11.2021 17:27:35
停止:29.11.2021 17:27:36
开始时间:29.11.2021 17:27:36
停止:29.11.2021 17:27:37
开始时间:29.11.2021 17:27:37
停止:29.11.2021 17:27:38
【问题讨论】:
-
您尝试了多个同时的客户端还是仅来自单个客户端的跟踪?
-
您使用的是哪个版本的 Asp.net core SignalR?如果您使用的是 Asp.net core 5.0 或 6.0,您可以尝试配置 server MaximumParallelInvocationsPerClient 选项。此外,如果您使用的是以前的版本,来自同一连接的 Hub 方法将按顺序调用。如果您想支持并行处理,您可以让 Hub 方法启动一个后台进程,该进程在完成时调用客户端方法(使用 HubContext)。
-
@Caius Jard:上面的日志来自一个客户端。当使用多个客户端时,服务器会并行处理调用。
-
@Zhi Lv:谢谢!使用 MaximumParallelInvocationsPerClient 有效。
标签: c# angular asp.net-core signalr