我有一个正在运行的异步任务,它调用一个Web服务:
private async Task GetResult()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_baseAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Username", _username);
client.DefaultRequestHeaders.Add("Action", "GET");
/* etc */
var response = await client.GetAsync(client.BaseAddress);
}
}
我想分离出HttpClient对象的创建,以便对其进行参数化和重用:
private async Task GetResult()
{
using (var client = GetClient(_baseAddress, _username))
{
var response = await client.GetAsync(client.BaseAddress);
}
}
private static HttpClient GetClient(string Address, string Username)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(Address);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Username", Username);
client.DefaultRequestHeaders.Add("Action", "GET");
/* etc */
return client;
}
}
虽然这看起来在功能上与我相同,但后者会因内部异常而引发AggregateException
错误
无法访问已处置的对象。对象名称:'System.Net.Http.HttpClient'。
也许有一些我不理解的异步微妙?
答案 0 :(得分:7)
摆脱NpgsqlCommand cmd = new NpgsqlCommand("select * from my_box", conn);
NpgsqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
NpgsqlBox b = (NpgsqlBox)reader.GetValue(0);
}
reader.Close();
内的using
。您只使用GetClient
表示仍属于“所有权”的内容,当您using
时,您“正在放弃对来电者的所有权”。
现在调用者可以使用return client;
语句(您已在using
中正确执行此操作)。
这与asnyc无关,只是标准的GetResult
行为。