您如何等待ASPNET CORE SignalR Hub的长期运行

时间:2018-12-17 18:05:01

标签: asp.net-core signalr signalr-hub asp.net-core-signalr

我有一个申请流程,其中:

  1. 客户端Javascript触发signalR集线器
  2. 进行异步呼叫 长时间运行
  3. 操作完成后,signalR会通知客户端JavaScript

我以为这很简单:

服务器端:

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 :(得分:0)

首先,删除void方法以长时间运行。使用Task返回类型方法。

尝试一下。

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