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

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

內容 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的使用中同步異步問題