zoukankan      html  css  js  c++  java
  • 利用多线程实现对网站状态的监控

         如果有200个站点,通过Ping 测试站点是否正常,如果每次ping用时为0.5秒,那么至少要花掉100秒,这是个漫长的等待时间,所以可以考虑用多线程来实现。

        注意:使用C#的PingReply 即使返回结果不是IPStatus.Success,站点也有可能访问,因为空间商有可能关闭ICMP服务,或者有防火墙阻止了ping的包。最好是再使用WebClient做一起请求,看是否成功。

       核心代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.NetworkInformation;
    using System.Collections;
    using Super.Ft.IDAL;
    using Super.Ft.DBFactory;
    using Super.Ft.Entity;
    using System.Data;
    using System.Threading;
    using System.Net;
    using System.IO;
    
    namespace Super.Ft.BLL
    {
        public class ThreadPing
        {
            public SiteConditionEntity SCEntity { get; set; }
    
            public SiteInfoEntity SiteEntity { get; set; }
    
            public ThreadPing(SiteInfoEntity s)
            {
                SiteEntity = s;
                SCEntity = new SiteConditionEntity();
            }
    
            public void search()
            {
                Ping p = new Ping();
                SCEntity.Siteinfoid = SiteEntity.SiteInfoID;
                SCEntity.SiteUrl = SiteEntity.SiteUrl;
                SCEntity.SiteName = SiteEntity.SiteName;
                SCEntity.MonitorDate = DateTime.Now;
                SCEntity.ADDTIME = DateTime.Now;
                try
                {
                    PingReply reply = p.Send(SiteEntity.SiteUrl.Replace("http://", string.Empty).Replace(" ", ""));
                    StringBuilder sbuilder = new StringBuilder();
                    if (reply.Status == IPStatus.Success)
                    {
                        SCEntity.Delaytime = reply.RoundtripTime;//延时
                        SCEntity.MonitorCondition = reply.RoundtripTime  "正常";
                    }
                    else
                    {
                        SCEntity.Delaytime = 0;
                        SCEntity.MonitorCondition = "ping不通";
                        ////异常记录
                        //try
                        //{
                        //    WebClient web = new WebClient();
                        //    Stream data = web.OpenRead(SiteEntity.SiteUrl);
                        //    SCEntity.Delaytime = 0;
                        //    SCEntity.MonitorCondition = "正常";
                        //}
                        //catch (Exception)
                        //{
    
                        //    SCEntity.Delaytime = -1;
                        //    SCEntity.MonitorCondition = "异常";
                        //}
                     
                       // byte[] buffer = web.DownloadData(SiteEntity.SiteUrl);
                      //  string aa = System.Text.Encoding.GetEncoding("gb2312").GetString(buffer);
                        //if (aa.Length > 0)
                        //{
                        //    SCEntity.Delaytime = 0;
                        //    SCEntity.MonitorCondition = "正常";
                        //}
                        //else
                        //{
                        //    SCEntity.Delaytime = -1;
                        //    SCEntity.MonitorCondition = "异常";
                        //}
                    }
                }
                catch
                {
                    //异常记录
                    SCEntity.Delaytime = -1;
                    SCEntity.MonitorCondition = "异常";
                }
            }
        }
    
        public class ThreadManage
        {
            Thread[] t;
            public List<SiteInfoEntity> SiteEntityList { get; set; }
    
            public List<SiteConditionEntity> SCEntityList { get; set; }
            public ThreadManage(List<SiteInfoEntity> list)
            {
                t = new Thread[list.Count];
                SiteEntityList = list;
                SCEntityList = new List<SiteConditionEntity>();
    
            }
    
            public void Start()
            {
                ThreadPing wp;
                for (int lIdx = 0; lIdx < SiteEntityList.Count; lIdx++)
                {
                    wp = new ThreadPing(SiteEntityList[lIdx]);
    
                    SCEntityList.Add(wp.SCEntity);
                    t[lIdx] = new Thread(new ThreadStart(wp.search));
                    // start the Thread object, which executes the search().
                    t[lIdx].Start();
                }
    
                for (int lIdx = 0; lIdx < SiteEntityList.Count; lIdx++)
                {
                    // waiting for all the Threads to finish.
                    t[lIdx].Join();
                }
            }
        }
    
    
    }
    

        前段调用如下:

       public static List<SiteConditionEntity> LiveMeshPingSiteInfo()
            {
               
                List<SiteInfoEntity> SiteEntityList = SiteInfoBLL.LoadSiteList();
                DateTime lStarted = DateTime.Now;
                ThreadManage tm = new ThreadManage(SiteEntityList);
            
                tm.Start();
             
                TimeSpan _timeSpent = DateTime.Now.Subtract(lStarted);
                return tm.SCEntityList;
    
    
              
            }
    
    
  • 相关阅读:
    给UILabel设置不同的字体和颜色
    通过btn获取所在cell
    常用网站
    如何设计一个 iOS 控件?(iOS 控件完全解析) (转)
    #Mac技巧#如何在Mac系统上新建TXT文档,以及打开txt文稿的乱码问题如何解决
    整理 iOS 9 适配中出现的坑(图文)(转)
    UISegmentedControl
    Xcode因为证书问题经常报的那些错
    iOS开发--UIDatePicker
    IOS开发中有用的第三方库
  • 原文地址:https://www.cnblogs.com/dooom/p/1893738.html
Copyright © 2011-2022 走看看