1. 程式人生 > >.Net(C#)實現非同步程式設計

.Net(C#)實現非同步程式設計

最近編寫了一個檢查伺服器叢集的客戶端程式,用於檢查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)
            {

            }