c# 異步調用(異步模式,基於事件)

c# 異步調用之異步模式
Func<string, IImageRequest, string> downloadString = (address, req) => { var client = new WebClient(); foreach (var header in req.Headers) { client.Headers.Add(header.Key, header.Value); } client.Credentials = req.Credentials; client.Encoding = System.Text.Encoding.UTF8; return client.DownloadString(address); }; Action<SearchItemResult> addItem = item => _searchInfo.List.Add(item); foreach (var req in GetSearchRequests()) { downloadString.BeginInvoke(req.Url, req, ar =>//BeginInvoke:線程池中一個線程異步調用 { try { string resp = downloadString.EndInvoke(ar);//downloadString異步方法執行結束,執行ar委託 var images = req.Parse(resp); foreach (var image in images) { this.Dispatcher.Invoke(addItem, image);//當前線程回到主線程同步執行 } } catch (WebException ex) when (ex.Message.Contains("401")) { MessageBox.Show(errorMessage, "Registration Needed"); } }, null); }

  

c#異步調用之基於事件
foreach (var req in GetSearchRequests()) { var client = new WebClient(); foreach (var header in req.Headers) { client.Headers.Add(header.Key, header.Value); } client.Credentials = req.Credentials; client.DownloadStringCompleted += (sender1, e1) => { try { string resp = e1.Result; var images = req.Parse(resp); foreach (var image in images) { _searchInfo.List.Add(image);//事件處理程序能夠直接訪問UI } } catch (Exception ex) when (ex.InnerException?.Message.Contains("401") ?? false) { MessageBox.Show(errorMessage, "Registration Needed"); } }; client.DownloadStringAsync(new Uri(req.Url));//異步變體方法 以「async」後綴;結束以後會調用事件,此方法對應DownloadStringCompleted事件 }

  

//異步調用之基於任務(TAP)
        private async void OnTaskBasedAsyncPattern(object sender, RoutedEventArgs e)//async關鍵字建立了一個狀態機
        {
            _cts = new CancellationTokenSource();
            try
            {
                foreach (var req in GetSearchRequests())
                {
                    var clientHandler = new HttpClientHandler
                    {
                        Credentials = req.Credentials
                    };
                    var client = new HttpClient(clientHandler);
                    foreach (var header in req.Headers)
                    {
                        client.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }

                    var response = await client.GetAsync(req.Url, _cts.Token);//解除線程阻塞
                    response.EnsureSuccessStatusCode();
                    string resp = await response.Content.ReadAsStringAsync();//解除線程阻塞
                    await Task.Run(() =>//後臺線程運行
                    {
                        var images = req.Parse(resp);
                        foreach (var image in images)
                        {
                            _cts.Token.ThrowIfCancellationRequested();
                            _searchInfo.List.Add(image);//UI調用問題:BindingOperations.EnableCollectionSynchronization,啓用集合同步訪問功能
                        }
                    }, _cts.Token);
                }
            }
            catch (HttpRequestException ex) when (ex.Message.Contains("401"))
            {
                MessageBox.Show(errorMessage, "Registration Needed");
            }
            catch (OperationCanceledException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
相關文章
相關標籤/搜索