Как обрабатывать несколько событий одновременно в клиенте С#

У меня есть клиентское приложение SignalR, написанное на C#, которое подписывается на событие из концентратора. Когда событие «запускается», приложение выполняет метод.

Вопрос в том, что все события такого рода, этому клиенту, обрабатываются последовательно.

Сценарий использования/процесс:

  1. В браузере пользователь нажимает кнопку
  2. Кнопка инициирует вызов концентратора SignalR.
  3. Концентратор SignalR отправляет сообщение определенному клиенту SignalR.
  4. Клиент SignalR получает событие/сообщение
  5. Клиент SignalR вызывает метод, который сохранит сообщение в базе данных.
  6. Клиент SignalR вызывает метод в концентраторе для возврата результата.
  7. Хаб доставляет пользователю результат

Если другой пользователь одновременно нажимает кнопку, клиент SignalR будет сохранять только одно сообщение за раз.

Пример клиента:

myHub.On<ExecuteRequestModel, string>("Execute", (request, to) =>
{
    logger.Info("Execute request received for connectionID: " + connection.ConnectionId);

    myMethod();

    myHub.Invoke("ExecuteResult", response, to);

    logger.Info("Execute request processed");
    logger.Info("...");
});

Есть ли рекомендуемая практика для одновременной обработки нескольких событий?


person Guilherme Ferreira    schedule 11.01.2017    source источник
comment
Можете ли вы рассказать немного больше... может быть, с примером сценария?   -  person Hackerman    schedule 11.01.2017
comment
Привет @Hackerman. Вопрос обновлен. Не могли бы вы взглянуть?   -  person Guilherme Ferreira    schedule 11.01.2017
comment
Возможно, для этого можно использовать Task.Run, но я не уверен, сможете ли вы отправить ответ из другого потока. А меня интересует дизайн. Почему веб-приложение (концентратор) должно связываться с уровнем базы данных с помощью SignalR и не использовать веб-службу или что-то в этом роде.   -  person H.G. Sandhagen    schedule 11.01.2017
comment
Может быть связано: stackoverflow.com/questions/27485996/   -  person Hackerman    schedule 11.01.2017
comment
см. stackoverflow.com/questions /10180052/ вам практически ничего не нужно делать, чтобы получить параллелизм, вы можете беспокоиться только о своем общем состоянии   -  person Oleg Bogdanov    schedule 12.01.2017


Ответы (1)


Это можно решить с помощью Async/Await. Асинхронная функция будет отвечать за ответ концентратору о результате.

myHub.On<ExecuteRequestModel, string>("Execute", async (request, to) => 
    await onExecute(request, to)
);
person Guilherme Ferreira    schedule 14.02.2017