zoukankan      html  css  js  c++  java
  • SignalR的简单实现

    1创建mvc的空项目

    2添加文件夹Counters放在里面的类用于封装性能计数器

    3创建PerfCounterWrapper类用于封装性能计数器的实体

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Web;
    
    namespace SignalR.Counters
    {
        public class PerfCounterWrapper
        {
            public PerfCounterWrapper(string name, string category, string counter, string instance = "")
            {
                _counter = new PerformanceCounter(category, counter, instance, readOnly: true);
                this.Name = name;
            }
            public string Name { get; set; }
    
            PerformanceCounter _counter;
    
            public float Value
            {
                get
                {
                    return _counter.NextValue();
                }
            }
        }
    }

    注:通过nuget导入Diagnostics类库

    4封装性能计数器的业务逻辑

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace SignalR.Counters
    {
        public class PerfCounterService
        {
            List<PerfCounterWrapper> _counters;
    
            public PerfCounterService()
            {
                this._counters = new List<PerfCounterWrapper>();
                _counters.Add(new PerfCounterWrapper("Processor", "Processor", "% Processor Time", "_Total"));
                _counters.Add(new PerfCounterWrapper("Paging", "Memory", "Pages/sec"));
                _counters.Add(new PerfCounterWrapper("Disk", "PhysicalDisk", "% Disk Time", "_Total"));
            }
    
            public dynamic GetResults()
            {
                return _counters.Select(c => new { name = c.Name, value = c.Value }
                );
            }
    
        }
    }

    5创建我们的工作目录-hubs并添加一个hub

    using Microsoft.AspNet.SignalR;
    using Microsoft.AspNet.SignalR.Hubs;
    using SignalR.Counters;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Web;
    
    namespace SignalR.Hubs
    {
        //指定该hub的名字,用于在前台中创建使用
        [HubName("PerfHub")]
        public class PerfHub : Hub
        {
            public PerfHub()
            {
                StartCounterCollection();
            }
    
            private void StartCounterCollection()
            {
                Task.Factory.StartNew(async () =>
                {
                    var perfService = new PerfCounterService();
                    while (true)
                    {
                        var results = perfService.GetResults();
                        Clients.All.newCounters(results);
                        await Task.Delay(2000);
                    }
                }, TaskCreationOptions.LongRunning);
            }
            //发送信息
            public void Send(string name, string message)
            {
                Clients.All.addSomeMessage(name, message);
            }
        }
    }

    页面的内容

    @model dynamic
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    
    <div class="container">
        <input type="text" id="message" />
        <input type="button" id="sendmessage" value="Send" />
        <input type="hidden" id="displayname" />
        <ul id="discussion">
        </ul>
    </div>
    
    <script src="~/Scripts/jquery-1.6.4.js"></script>
    
    <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
    <script type="text/javascript" src="~/signalr/hubs"></script>
    
    
    <script>
        $(function () {
    
            //  链接hub
            var chat = $.connection.PerfHub;
            $.connection.hub.logging = true;
    
            $.connection.hub.start();
            // 执行返回数据 perfhub中的Send中调用的方法签名一致
            chat.client.addSomeMessage = function (name, message) {
                // 将发送的内容显示在页面 
                $('#discussion').append('<li><strong>' + htmlEncode(name)
                    + '</strong>: ' + htmlEncode(message) + '</li>');
            };
            // 弹出输入名字的文本框
            $('#displayname').val(prompt('Enter your name:', ''));
            // Set initial focus to message input box.  
            $('#message').focus();
            //启动hub的工作
            
            $.connection.hub.start().done(function () {
    
                $('#sendmessage').click(function () {
                    // 发送信息
                    chat.server.send($('#displayname').val(), $('#message').val());
                    //清空输入的内容 
                    $('#message').val('').focus();
                });
            });
        });
    
        function writeEvent(eventLog, logClass) {
            var now = new Date();
            var nowStr = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
            $('#discussion').prepend('<li class="' + logClass + '"><b>' + nowStr + '</b> ' + eventLog + '.</li>');
        }
        // This optional function html-encodes messages for display in the page.
        function htmlEncode(value) {
            var encodedValue = $('<div />').text(value).html();
            return encodedValue;
        }
    </script>
  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/liuchang/p/4463344.html
Copyright © 2011-2022 走看看