У нас есть требование, чтобы один пользователь мог иметь два запроса на концентратор сигналов, которые выполняются одновременно (потому что один из этих запросов занимает много времени).Похоже, что с последней версией запросы ядра-сигнализатора ставятся в очередь, и второй запрос начинает выполняться только после того, как первый запрос завершен.
Я создал тестовый пример для воспроизведения этого, и я, кажется,быть в состоянии обойти это, создав 2 объекта HubConnection на стороне клиента, однако не представляется идеальным, чтобы они были открыты все время, чтобы позволить эту функциональность, и я подозреваю, что это ожидаемое поведение, возможно, есть причина, почему ясделать это нелегко.
Мы также использовали это в предыдущем проекте, в котором использовался более старый сигнализатор (не ядро сигнализатора), и эта функциональность, похоже, работала, поэтому возможно понижение уровня сигнализатора.
Код концентратора:
public class TestHub: Hub
{
Random r = new Random();
public async Task SlowTask()
{
await Task.Delay(5000);
await Clients.Caller.SendAsync("slowNumber", r.Next());
}
public async Task FastTask()
{
await Task.Delay(5);
await Clients.Caller.SendAsync("fastNumber", r.Next());
}
}
Код клиента:
function GetWebSocketHub(hubUrl: string): HubConnection {
const connection = new HubConnectionBuilder()
.withUrl(hubUrl)
.configureLogging(LogLevel.Debug)
.build();
connection.start();
return connection;
}
export class TestComponent extends React.Component {
connection1: HubConnection;
connection2: HubConnection;
constructor(props: any) {
super(props);
this.connection1 = GetWebSocketHub("/hubs/test");
this.connection2 = GetWebSocketHub("/hubs/test");
}
fastWebService = () => {
this.connection1.send("fastTask");
}
slowWebService = () => {
this.connection2.send("slowTask");
}
render() {
return (
<div>
<button onClick={() => this.fastWebService()}>Fast</button>
<button onClick={() => this.slowWebService()}>Slow</button>
</div>
);
}
}
С инструментами разработчика, открытыми в Chrome, на вкладке сети дважды нажмите медленный запрос, как я и ожидалчтобы увидеть ответ, возвращающийся в то же время, но кажется, что он запускается только после завершения первого.В этом примере быстрый запрос использует другой HubConnection, поэтому он может нормально взаимодействовать при выполнении медленных запросов.