![](/img/trans.png)
[英]GetStringAsync method in HttpClient throw an exception in WP8
[英]HttpClient freezes on the GetStringAsync method
我有這個c#MVC代碼,它可以與GetAsync和GetPost方法一起正常工作,但是當使用GetStringAsync時,它會凍結在該行:
version = await client.GetStringAsync("/API/Version");
驅動程序代碼:
Task<string>[] tasks = new Task<string>[count];
for (int i = 0; i < count; i++)
{
tasks[i] = MyHttpClient.GetVersion(port, method);
}
Task.WaitAll(tasks);
string[] results = new string[tasks.Length];
for(int i=0; i<tasks.Length; i++)
{
Task<string> t = (Task<string>)(tasks[i]);
results[i] = (string)t.Result;
}
HttpCilent代碼:
public static async Task<string> GetVersion(int port, string method)
{
try
{
var client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:" + port);
string version = null;
if (method.ToUpper().Equals("GETSTR"))
{
version = await client.GetStringAsync("/API/Version");
}
else if (method.ToUpper().Equals("GET"))
{
HttpResponseMessage res = client.GetAsync("/API/Version").Result;
version = res.Content.ReadAsStringAsync().Result;
}
else if (method.ToUpper().Equals("POST"))
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("name", "jax")
});
HttpResponseMessage res = client.PostAsync("/API/Version", content).Result;
version = res.Content.ReadAsStringAsync().Result;
}
client.Dispose();
return version;
}
catch (Exception ex)
{
return "Error: " + ex.Message;
}
}
}
有什么想法嗎?
通常,您不應該將async
/ await
與.Result
和.Wait()
。 首先修復GetVersion
方法:
public static async Task<string> GetVersion(int port, string method)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:" + port);
if (method.ToUpper().Equals("GETSTR"))
{
return await client.GetStringAsync("/API/Version")
.ConfigureAwait(false);
}
else if (method.ToUpper().Equals("GET"))
{
var res = await client.GetAsync("/API/Version").ConfigureAwait(false);
return await res.Content.ReadAsStringAsync().ConfigureAwait(false);
}
else if (method.ToUpper().Equals("POST"))
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("name", "jax")
});
var res = await client.PostAsync("/API/Version", content)
.ConfigureAwait(false);
return await res.Content.ReadAsStringAsync().ConfigureAwait(false);
}
}
}
catch (Exception ex)
{
return "Error: " + ex.Message;
}
}
所有我在這里所做的是替換<task>.Result
與調用await <task>
。 對於每個await
,將在await
之后的方法部分注冊為正在等待的Task
的延續(如果遇到每個await
表達式時),而不是在.Result
情況下阻塞線程。
現在,在調用代碼中,您需要做同樣的事情:
var tasks = new Task<string>[count];
for (int i = 0; i < count; i++)
{
tasks[i] = MyHttpClient.GetVersion(port, method);
}
var results = new string[tasks.Length];
for (int i = 0; i < tasks.Length; i++)
{
results[i] = await tasks[i];
}
或更簡單地說:
var tasks = new Task<string>[count];
for (int i = 0; i < count; i++)
{
tasks[i] = MyHttpClient.GetVersion(port, method);
}
var results = await Task.WhenAll(tasks);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.