asp.net – 使用Groups进行分页的SignalR
发布时间:2020-12-16 03:46:19 所属栏目:asp.Net 来源:网络整理
导读:我是SignalR的新手,在学习过程中,我正在尝试制作股票代码.我有超过1000个股票列表,并希望显示实时更改的分页和更新,这就是我使用SignalR组的原因.问题是,当我打开第1页时,一切正常,直到我打开第2页,然后第1页停止获取信号,第2页开始获取信号.我在SignalR小组
我是SignalR的新手,在学习过程中,我正在尝试制作股票代码.我有超过1000个股票列表,并希望显示实时更改的分页和更新,这就是我使用SignalR组的原因.问题是,当我打开第1页时,一切正常,直到我打开第2页,然后第1页停止获取信号,第2页开始获取信号.我在SignalR小组中错过了什么?请帮帮我,谢谢.
毂 [HubName("stockTicker")] public class StockTickerHub : Hub { private StockTicker _stockTicker; public StockTickerHub() : this(StockTicker.Instance) { } public StockTickerHub(StockTicker stockTicker) { _stockTicker = stockTicker; } public void OpenMarket() { var page = this.Context.QueryString["page_no"]; int pageno = Convert.ToInt32(page); _stockTicker.OpenMarket(pageno); tryAddGroup(page); } public Task tryAddGroup(string page) { return Groups.Add(Context.ConnectionId,page); } } StockTicker.cs public class StockTicker { MainModel _model = new MainModel(); private static Lazy<StockTicker> _instance = new Lazy<StockTicker>(() => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients)); private TimeSpan _updateInterval = TimeSpan.FromMilliseconds(3000); private Timer _timer; public volatile int pageno; private StockTicker(IHubConnectionContext<dynamic> clients) { Clients = clients; } public static StockTicker Instance { get { return _instance.Value; } } private IHubConnectionContext<dynamic> Clients { get; set; } public void OpenMarket(int page_no) { pageno = page_no; _timer = new Timer(UpdateStockPrices,pageno,_updateInterval,_updateInterval); } private void UpdateStockPrices(object state) { var latest_stocks = new List<StockViewModel>(); latest_stocks = _model.Get100Stocks(pageno); foreach (var stock in latest_stocks) { BroadcastStockPrice(stock,pageno); } } private void BroadcastStockPrice(StockViewModel stock,int pageno) { Clients.Group(pageno.ToString()).updateStockPrice(stock); //Clients.All.updateStockPrice(stock); } } (更新的问题) StockTicker.js if (!String.prototype.supplant) { String.prototype.supplant = function (o) { return this.replace(/{([^{}]*)}/g,function (a,b) { var r = o[b]; return typeof r === 'string' || typeof r === 'number' ? r : a; } ); }; } jQuery.fn.flash = function (color,duration) { var current = this.css('backgroundColor'); this.animate({ backgroundColor: 'rgb(' + color + ')' },duration / 2) .animate({ backgroundColor: current },duration / 2); }; $(function () { var ticker = $.connection.stockTicker; var $stockTable = $('#stockTable'); var $stockTableBody = $stockTable.find('tbody'); tdPrice = '<td data-rank-price="{currency_query}" data-sort="{currency_price_usd}"><div data-price-spn="{currency_query}">${currency_price_usd}</div></td>'; tdPercentage = '<td data-rank-perc="{currency_query}" data-sort="{currency_change_24h_usd}"><div data-change-spn="{currency_query}"><span class="{DirectionClass}">{currency_change_24h_usd}</span></div></td>'; tdVolume = '<td data-rank-volume="{currency_query}" data-sort="{currency_24h_volume_usd}"><div data-24-volume-spn="{currency_query}>${currency_24h_volume_usd}</div></td>'; tdMarketcap = '<td data-rank-cap="{currency_query}" data-sort="{currency_market_cap_usd}"><div data-mcap-spn="{currency_query}">${currency_market_cap_usd}</div></td>'; function formatStock(stock) { return $.extend(stock,{ currency_price_usd: formatprices(stock.currency_price_usd),currency_change_24h_usd: stock.currency_change_24h_usd == null ? '0.00%' : (stock.currency_change_24h_usd).toFixed(2) + '%',currency_24h_volume_usd: stock.currency_24h_volume_usd == null ? '0' : nFormatter(stock.currency_24h_volume_usd,2),currency_market_cap_usd: stock.currency_market_cap_usd == null ? '0' : nFormatter(stock.currency_market_cap_usd,DirectionClass: stock.currency_change_24h_usd === 0 ? 'nochange' : stock.currency_change_24h_usd >= 0 ? 'green' : 'red' }); } function nFormatter(num,digits) { var si = [ { value: 1,symbol: "" },{ value: 1E3,symbol: "K" },{ value: 1E6,symbol: "M" },{ value: 1E9,symbol: "B" },{ value: 1E12,symbol: "T" },{ value: 1E15,symbol: "P" },{ value: 1E18,symbol: "E" } ]; var rx = /.0+$|(.[0-9]*[1-9])0+$/; var i; for (i = si.length - 1; i > 0; i--) { if (num >= si[i].value) { break; } } return (num / si[i].value).toFixed(digits).replace(rx,"$1") + si[i].symbol; } function formatprices(n,curr) { var sep = sep || "."; var decimals; if (n > 0.99999999) { decimals = decimals || 2; } else { decimals = decimals || 6; } return n.toLocaleString().split(sep)[0] + sep + n.toFixed(decimals).split(sep)[1]; } $.extend(ticker.client,{ updateStockPrice: function (stock) { var displayStock = formatStock(stock),$tdprice = $(tdPrice.supplant(displayStock)),$tdpercentage = $(tdPercentage.supplant(displayStock)),$tdvolume = $(tdVolume.supplant(displayStock)),$tdcap = $(tdMarketcap.supplant(displayStock)); if (stock.LastChange != 0.0) { bgprice = stock.LastChange < 0.0 ? '255,148,148' : '154,240,117'; $stockTableBody.find('td[data-rank-price=' + stock.currency_query + ']').replaceWith($tdprice); $tdpricespn = $stockTableBody.find('div[data-price-spn=' + stock.currency_query + ']'); $tdpricespn.flash(bgprice,1500); } if (stock.LastChangePercentage != 0.0) { bgper = stock.LastChangePercentage < 0.0 ? '255,117'; $stockTableBody.find('td[data-rank-perc=' + stock.currency_query + ']').replaceWith($tdpercentage); $tdpercentagespn = $stockTableBody.find('div[data-change-spn=' + stock.currency_query + ']'); $tdpercentagespn.flash(bgper,1500); } if (stock.LastChangeVolume != 0.0) { bgvol = stock.LastChangeVolume < 0.0 ? '255,117'; $stockTableBody.find('td[data-rank-volume=' + stock.currency_query + ']').replaceWith($tdvolume); $tdvolumespn = $stockTableBody.find('div[data-24-volume-spn=' + stock.currency_query + ']'); $tdvolumespn.flash(bgvol,1500); } if (stock.LastChangeCap != 0.0) { bgcap = stock.LastChangeCap < 0.0 ? '255,117'; $stockTableBody.find('td[data-rank-cap=' + stock.currency_query + ']').replaceWith($tdcap); $tdcapspn = $stockTableBody.find('div[data-mcap-spn=' + stock.currency_query + ']'); $tdcapspn.flash(bgcap,1500); } } }); $.connection.hub.url = 'http://localhost:13429/signalr'; $.connection.hub.qs = { 'page_no': $("#page").val() }; $.connection.hub.start().done(function () { console.log("connected"); }).then(function () { return ticker.server.openMarket(); }); }); 解决方法
查看代码,您的全局变量pageno始终是请求的最后一页:
public void OpenMarket(int page_no) { pageno = page_no; _timer = new Timer(UpdateStockPrices,_updateInterval); } 您需要另一个跟踪最大页面的变量. public volatile int pageMax; public void OpenMarket(int page_no) { pageno = page_no; pageMax = pageno > pageMax : pageno ? pageMax; _timer = new Timer(UpdateStockPrices,_updateInterval); } 然后确保向页面广播正确的股票. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 一步步开发自己的博客 .NET版(3、注册登录功能)
- .NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同
- 在updatepanel asp.net c#中的AsyncFileUpload中上传文件后
- asp.net-mvc – ASP.NET MVC会话状态
- asp.net-mvc – ASP.NET MVC – Typesafe Html.TextBoxFor,
- Asp.net视图状态MAC的验证失败
- asp.net mvc 依赖注入Ninject
- asp.net – 与web.config中的targetFramework相关的配置错误
- asp.net core 系列 12 选项 TOptions
- 如果没有授权,如何将用户重定向到ASP.NET页面?
推荐文章
站长推荐
- 如何为Asp.Net中的所有子文件夹注册HttpHandler?
- ASP.NET MVC 4和Entity Framework 5.0中的MySQL连
- entity-framework – 导航属性过滤器
- asp.net – 名称空间’System.Web.UI.WebControl
- asp.net-mvc – 我如何从MVC3 Razor Controller调
- asp.net – 如何以完全信任的方式部署IIS ASP .N
- 如何在ASP.NET Core MVC中获取Url Referrer?
- asp.net-mvc-3 – MVC3下载单个文件
- asp.net-mvc – 如何使用ASP.NET MVC和表单身份验
- asp.net-mvc – ASP.net MVC – 呈现包含不同类型
热点阅读