C# 中HttpClient的使用中同步異步問題
阿新 • • 發佈:2018-12-03
內容 ogr 數據 serialize json 實體 line 我們 clas
項目中遇到了這樣的問題:
第一次 :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); }
C# 中HttpClient的使用中同步異步問題