Как вы ожидаете длительный процесс от ASPNET CORE SignalR Hub - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть поток приложений, в котором:

  1. Clientside Javascript запускает signalR Hub
  2. Асинхронный вызов выполняется для длительной работы
  3. После завершения операции JavaScript на стороне клиентауведомляется signalR

Я предполагал, что это будет просто:

Сторона сервера:

public async void SendMessage()
{
    await Task.Delay(1000);
    Clients.All.SendAsync("ReceiveMessage");
}

Сторона клиента:

var hub = new signalR.HubConnectionBuilder().withUrl('/disposeBugHub').build();

this.hub.on("ReceiveMessage", function () {
    alert('Message Received');
});

this.hub.start()
    .then(function () {
        hub.invoke("SendMessage");
    })
    .catch(function (err) {
        return console.error(err.toString());
    });

Однако Clients.All.SendAsync («ReceiveMessage»);Вызов всегда генерирует исключение System.ObjectDisposedException: «Не удается получить доступ к удаленному объекту».Исключение.

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

1 Ответ

0 голосов
/ 18 декабря 2018

Прежде всего, удалите метод void для длительного процесса.используйте Task метод возвращаемого типа.

Попробуйте это.

        public async Task SendMessage()
        {
            await Task.Delay(10000);
            Clients.All.SendAsync("ReceiveMessage");
        }
...