1. 程式人生 > >C# 中HttpClient的使用中同步非同步問題

C# 中HttpClient的使用中同步非同步問題

專案中遇到了這樣的問題:

第一次 :HttpResponseMessage response = await httpClient.PostAsync(url, null);傳送了一個post非同步請求 ,操作了一個datatable的資料

第二次:又發了一個post非同步請求,用到了第一步中的datatable的資料

剛開始都是非同步方式呼叫,發現最終結果有時候對,有時候不對,除錯才發現是兩次非同步請求之間是相關的,個人覺得有點類似多執行緒之間資料沒有進行同步,所以網上查了很多資料,終於找到以下方法圓滿解決問題。


       HttpClient中非同步方法的同步呼叫 在System.Net.Http中,提供了使用Http與遠端伺服器通訊的httpClient,但是裡面都是非同步方法,有時候我們並不需要使用非同步操作。這個時候可以使用如下的方式來進行同步呼叫。

 同步呼叫的這段程式碼是引用別人的。

class Program
    {
        static void Main(string[] args)
        {
            string _address = "http://api.worldbank.org/countries?format=json";
            // Create an HttpClient instance  
            HttpClient client = new HttpClient();

            //遠端獲取資料
            var task = client.GetAsync(_address);
            var rep = task.Result;//在這裡會等待task返回。

            //讀取響應內容
            var task2 = rep.Content.ReadAsStringAsync();
            var ret = task2.Result;//在這裡會等待task返回。
            Console.WriteLine(ret);

            Console.WriteLine("Hit ENTER to exit...");
            Console.ReadLine();
        }
    }

下面再把Winform中HttpClient應用附上:

 HttpClient httpClient = new HttpClient();
  string url = "******";
  HttpResponseMessage response = await httpClient.PostAsync(url, null);
  response.EnsureSuccessStatusCode();
  string resultStr = await response.Content.ReadAsStringAsync();
  var dev = JsonConvert.DeserializeObject<List<實體類名>>(resultStr);
這個是不帶引數的post請求,解析的話要引用Newtonsoft.Json.dll,可以直接把Json資料轉成需要的實體類型別,然後就不必說了。

帶引數的應用:

  private async void HttpPost() {
            HttpClient httpClient = new HttpClient();

            var data = new Dictionary<string, string>();
            data["username"] = "cs_admin";
            data["password"] = "cs_12345";
            var content = new FormUrlEncodedContent(data);

            string url = "http://localhost:8080/server-http/http/emulator/post";
            HttpResponseMessage response = await httpClient.PostAsync(url, content);
            response.EnsureSuccessStatusCode();
            string resultStr = await response.Content.ReadAsStringAsync();
            Console.WriteLine(resultStr);
        }