您的位置:首页 > 其它

多线程检测服务器响应时间小工具

2017-03-12 15:53 162 查看
在日常工作当中,网络不稳定时有发生,由于该类问题往往呈现不稳定,时好时坏的情况,如果采取手动测试的方法,往往不能充分说明问题。所以,进行一段时间的连续监测是必要的。由于需要长时间监视,为了防止前台卡死与资源消耗,采用线程来进行网络监测。

1. C#中的线程。

分析需求,需要将参数传入线程。可以通过写一个线程类TestUrlThread来实现。该线程类将担负持有参数,持有线程主处理函数的功能。

    public class TestUrlThread

    {

        private string url;

        public TestUrlThread(string url)

        {

            this.url = url;

        }

        public void ThreadMain()

        {

                  //线程主处理函数,一般为一个循环,反复探测服务器相应状况。记录日志。监测完成一次后,休息几秒钟继续监测。

                 //通过队列来实现。监测完成1次后,将结果写入队列。队列应保持对每个线程持有一个,并全局唯一。

        }

    }

1.线程开启。可在点击按钮后,触发线程的开启。

Thread thread1 = new Thread(new ThreadStart(testThread1.ThreadMain));

thread1.Start();

为了做对比,可以同时开两个线程,一个用来监测我们需要监测的服务器,一个用来监测大型的稳定的网站。这样可以剔出掉自己网络不稳定造成的噪声。

使用两个写线程,一个读线程。

2.线程的等待与唤醒。

可使用lock, pulse(All), Wait搭配使用,进行线程的调度。

其中,lock为获得锁。当写线程获得锁的时候,将监测结果送入队列。通知所有其他线程进入就绪状态(唤醒其他线程)。然后自己释放掉锁。自己进入等待通知状态。

使用pulse(All), Wait的好处在于线程主动将自己放入等待通知的队列中,这样不会占用CPU资源。如果一直用sleep,一则时间不灵活,二则消耗资源。

类似的,读线程在读取队列时,要先获得锁。在读取到队列为空的时候,调用pulse(All),wait来唤醒写线程,同时自己释放锁,将自己进入等待通知

                lock (BasicWaitHandler.lockObj)

                {

                    if (url == "https://www.baidu.com")

                    {

                        QueueMgr.getInstance().enSQueue(log);

                    }

                    else

                    {

                        QueueMgr.getInstance().enQueue(log);

                    }

                    //wait 1s

                    Thread.Sleep(1000);

                    Monitor.PulseAll(BasicWaitHandler.lockObj);

                    Monitor.Wait(BasicWaitHandler.lockObj);

                }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐