Как разрешить одновременный запуск нескольких запросов концентраторов сигналов от одного и того же клиента - PullRequest
0 голосов
/ 08 апреля 2019

У нас есть требование, чтобы один пользователь мог иметь два запроса на концентратор сигналов, которые выполняются одновременно (потому что один из этих запросов занимает много времени).Похоже, что с последней версией запросы ядра-сигнализатора ставятся в очередь, и второй запрос начинает выполняться только после того, как первый запрос завершен.

Я создал тестовый пример для воспроизведения этого, и я, кажется,быть в состоянии обойти это, создав 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, поэтому он может нормально взаимодействовать при выполнении медленных запросов.

...