【问题标题】:Asp .net core SignalR send real time dataAsp .net core SignalR 发送实时数据
【发布时间】:2021-06-08 12:07:04
【问题描述】:

我有数据,我想将其呈现给用户,而他不需要刷新页面。 我正在使用这样的 Asp .net core SignalR:

using System.Threading;
using Microsoft.AspNetCore.SignalR;
using WSEP212.DomainLayer;

namespace WebApplication.Publisher
{
    public class ChartNotifications : Hub
    {
        // Create the instance of ChartDataUpdate    
        // Send Data every 1 seconds    
        readonly int _updateInterval = 1000;       
        //Timer Class    
        private Timer _timer;    
        private volatile bool _sendingChartData = false;    
        private readonly object _chartUpateLock = new object();
        PieChart pieChart = new PieChart();
        
        public ChartNotifications() {}    
        
     
        public void InitChartData()    
        {
            //Show Chart initially when InitChartData called first time    
            pieChart.SetPieChartData();
            sendChartData(pieChart);
            //Call GetChartData to send Chart data every chosen interval
            GetChartData();
        }       
        
        public void GetChartData()    
        {
            _timer = new Timer(ChartTimerCallBack, null, _updateInterval, _updateInterval);
        }    
        private void ChartTimerCallBack(object state)    
        {
            if (_sendingChartData)    
            {    
                return;    
            }    
            lock (_chartUpateLock)    
            {    
                if (!_sendingChartData)    
                {    
                    _sendingChartData = true;
                    pieChart.SetPieChartData();
                    sendChartData(pieChart);    
                    _sendingChartData = false;    
                }    
            }
        }    
        
        public async void sendChartData(PieChart chart)
        {
           await Clients.All.SendAsync("updateChart", chart.GetPieChartData());
        }
    }
}

但我得到一个错误 -> System.ObjectDisposedException:无法访问已处置的对象。 对象名称:'ChartNotifications'。

在客户端它看起来像这样:

chartConnection.start().then(() => {
            console.log("chart connection started");
            chartConnection.invoke('InitChartData');
});

你能告诉我我做错了什么吗?或任何其他使用 signalR 来完成此任务的想法? 我是新手,所以请您详细说明您的答案。

提前谢谢你!!

【问题讨论】:

    标签: c# asp.net-core model-view-controller timer signalr


    【解决方案1】:

    这不是推荐的方法。 documentation 明确表示“集线器是瞬态的”和“不要将状态存储在集线器类的属性中。每个集线器方法调用都在一个新的集线器实例上执行。所以你想要做的事情,无法通过这种方式实现。

    我建议您改为做什么(没有提供代码,只是对架构的一些想法):

    1. 添加Hosted Service
    2. 您可以将IServiceProvider 传递给服务构造函数
    3. 让服务控制一个定时器;当计时器到时,您可以使用服务提供者创建IServiceScope 并请求IHubContext<ChartNotifications> 的实例(参见documentation
    4. 使用该上下文将更新的数据发送到连接的客户端

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      相关资源
      最近更新 更多