c# - Async/Await handling group of HttpResponseMessage -
i previously posted question using httpclient
async/await. i'm trying figure out how in such way make post calls execute @ same time while still being able handle resulting httpresponsemessage
.
this i've come with. however, being noob await/async, i'm still unsure if i'm doing correctly or not. verify proper way ... or @ least proper way.
public async task processasync() { //query lists list<member> list = dbcontext.users.where(u => u.ismember).tolist(); //add members 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(); }
this appears me correct. however, have slight problem this. need tie each httpresponsemessage
member message created. current code returns task response message not contain link user. (the service i'm posting returns id specific service. need keep track of id each user have link between member id , service id).
does requirement of linking id response message member make unrealistic use above code or there way somehow return member part of task results?
i'm suggesting without trying out please careful replace these 2 lines:
var responses = await task.whenall(members.select(x => postmemberasync(x,_client))); await task.whenall(responses.select(r => processresponseasync(r,client)));
with this:
await task.whenall(members.select(async x => { var response = await postmemberasync(x, _client); await processresponseasync(response, client, x); }));
and of course need enhance processresponseasync argument member
Comments
Post a Comment