在signalR hub中实现长轮询数据库调用

时间:2014-01-14 19:28:31

标签: c# asp.net-mvc signalr

我有一个接收来自客户端的请求的集线器,如下所示:

 [HubName("Check")]
    public class Check : Hub
    {
        private long _sessionId;
        private string _sortType;
        private int _tableCount;
        private Timer _timer;

        public void Car(long sessionId, string sortType, int tableCount)
        {
            _sessionId = sessionId;
            _sortType = sortType;
            _tableCount = tableCount;
            StartCarTimer();
        }

        public void StartCarTimer()
        {
            _timer = new Timer(3000);
            _timer.Elapsed += CarTimerElapsed;
            _timer.Start();
        }

        void CarTimerElapsed(object sender, ElapsedEventArgs e)
        {  
            int countCars = CountCars();

            if (countCarPrices > _tableCount)
            {
                _tableCount = countCarPrices;
                Clients.All.car(GetCarTable());
            }   
        }


        private int GetCars()
        {
            CarPrices carPrices = new CarPriceRepository().FindCarPricesById(_sessionId);
            return carPrices;
        }
    }

我简化了一点但基本上我每隔3秒轮询一次数据库以检查更改,这真的感觉像是可怕的设计。我一直在寻找如何在没有任何结果的情况下解决这个问题。

朋友建议的一种方法是从更新数据库的服务通知服务器端的signalR集线器,但我不知道该怎么做。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:-1)

signalr在至少2个客户之间工作 客户端A,连接并等待消息,
客户端B,做某事(开始向服务器发出请求),服务器通知客户端A重新建立消息

GlobalHost.ConnectionManager.GetHubContext<T>().Clients

您可以使用此功能将所有客户送到任何地方 客户端与集线器中的客户端属性相同 和

Clients.Group("groupName").method(param)
像这样的一些代码,可以注意到你想要注意的客户端,方法是一个js方法,它通过signalr自动生成与你的hub方法相同的名字(首字母小写)