.Net(C#)實現非同步程式設計
阿新 • • 發佈:2019-02-11
最近編寫了一個檢查伺服器叢集的客戶端程式,用於檢查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) { }