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

    xiaoxiao2021-03-25  72

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

    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);                 }

    转载请注明原文地址: https://ju.6miu.com/read-34577.html

    最新回复(0)