【发布时间】:2015-06-02 19:55:17
【问题描述】:
我 previously posted 提出了一个关于将 HTTPClient 与 async/await 一起使用的问题。现在我试图弄清楚如何做到这一点,以便实际使 Post 调用同时执行,同时仍然能够处理生成的 HttpResponseMessage。
这就是我想出的。但是,作为等待/异步的菜鸟,我仍然不确定我是否正确执行此操作。有人可以验证这是执行此操作的正确方法……或者至少是正确的方法。
public async Task ProcessAsync() {
//Query lists
List<Member> list = dbContext.Users.Where(u => u.IsMember).ToList();
//Add members to mailing list through web service
await AddMembersAsync(list);
}
private async Task AddMembersAsync(List<Member> members) {
using(var _client = new HttpClient()) {
//Initialize Http Client
...
var responses = await Task.WhenAll(members.Select(x => PostMemberAsync(x,_client)));
await Task.WhenAll(responses.Select(r => ProcessResponseAsync(r,client)));
}
}
private async Task<HttpResponseMessage> PostMemberAsync(Member member, HttpClient client) {
var jss = new JavaScriptSerializer();
var content = jss.Serialize(new MemberPost() {
email_address = member.email,
...
});
return await client.PostAsync("uri",new StringContent(content, Encoding.UTF8, "application/json"));
}
private async Task ProcessResponsesAsync(HttpResponseMessage response, HttpClient client) {
if(response.IsSuccessStatusCode) {
var responseText = await response.Content.ReadAsStringAsync();
var jss = new JavaScriptSerializer();
var userid = jss.Deserialize<MemberResponse>(responseText);
//Store mailing user's id
...
}
response.Dispose();
}
这在我看来是正确的。但是,我对此有一个小问题。我需要将每个HttpResponseMessage 绑定到为其创建消息的成员。我当前的代码仅返回 Task 但响应消息不包含指向用户的链接。 (我发布到的服务返回一个特定于该服务的 ID。我需要跟踪每个用户的该 ID,以便在成员 ID 和服务 ID 之间建立链接)。
我将响应消息中的 id 链接到成员的要求是否使使用上述代码变得不切实际,或者有没有办法以某种方式将成员作为任务结果的一部分返回?
【问题讨论】:
-
public
async ProcessAsync()不是有效代码,没有返回类型或者它是一个不能异步的构造函数。 -
谢谢,我忘记了我的
Task返回值。我已经修复了代码。
标签: c# asynchronous async-await