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