C# 中HttpClient的使用中同步非同步問題
阿新 • • 發佈:2018-11-02
專案中遇到了這樣的問題:
第一次 :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應用附上:
這個是不帶引數的post請求,解析的話要引用Newtonsoft.Json.dll,可以直接把Json資料轉成需要的實體類型別,然後就不必說了。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);
帶引數的應用:
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);
}