最近编写了一个检查服务器集群的客户端程序,用于检查API接口是否可用,由于当时没有使用多线程技术,所有操作均在主进程中执行,这样就导致了2个问题:
1)由于要发送HTTP请求,导致主进程无响应,UI卡死
2)使用循环轮询集群的服务器列表,逐个请求发送到服务器,时间复杂度为O(n)
如果解决这2个问题:
1.使用BackgroudWork解决UI卡死的问题
HostRequest hostRequest = new HostRequest(this._uri, this._hostConfig);
using (BackgroundWorker bw = new BackgroundWorker())
{
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate {
this.dataGridView1.DataSource = this._dt;
}); //设置任务结束后的回调函数
bw.DoWork += new DoWorkEventHandler(delegate {
this._dt = hostRequest.Run();
});//设置需要执行的任务
bw.RunWorkerAsync();
}
2.使用Task解决HTTP请求并发的问题
IList<Task<HostRequestResult>> list_task = new List<Task<HostRequestResult>>();
foreach (string ip in this._hostConfig.GetIPList())
{
Task<HostRequestResult> t = new Task<HostRequestResult>(delegate
{
return HostRequest.HttpRequest(this._uri, ip, this._hostConfig.Cookie, this._hostConfig.Timeout);
}, TaskCreationOptions.AttachedToParent);//添加一个任务
list_task.Add(t);
t.Start();//启动任务
}
Task.WaitAll(list_task.ToArray<Task>());//这个操作是阻塞的,要等所有任务执行结束后,才会进行下一个语句
foreach (Task<HostRequestResult> t_result in list_task)
{
}