c# - Async with HTTPClient -
i'm calling web api httpclient in app wp8. when click button user credentials , if it's ok go main page. code:
calling method
private async void btnlogin_onclick(object sender, routedeventargs e) { var user = new user(); if (user.isauthenticated(tbusername.text, tbpassword.text)) { navigationservice.navigate(new uri("/mainpage.xaml")); } }
user class
public class user { private bool? _isauthenticated; public bool isauthenticated(string _username, string _password) { return (bool) (_isauthenticated ?? (_isauthenticated = authenticateasync(_username, _password).result)); } private static async task<bool> authenticateasync(string username, string password) { var baseurl = string.format(constant.authenticateapiurl, username, password); try { var client = new httpclient { baseaddress = new uri(baseurl) }; var result = await client.postasync(baseurl, new stringcontent("")).configureawait(false); result.ensuresuccessstatuscode(); } catch (httprequestexception ex) { return false; } return true; } }
the problem when await executed, blocks app , never returns.
i try lot of distinct codes think i'm lost now!!.
calling task<t>.result
or task.wait
on ui thread can cause deadlock explain in full on blog.
to fix it, replace every use of result
or wait
await
public async task<bool> isauthenticatedasync(string _username, string _password) { return (bool) (_isauthenticated ?? (_isauthenticated = await authenticateasync(_username, _password))); } private async void btnlogin_onclick(object sender, routedeventargs e) { var user = new user(); if (await user.isauthenticatedasync(tbusername.text, tbpassword.text)) { navigationservice.navigate(new uri("/mainpage.xaml")); } }
other notes:
- don't ignore compiler warnings. original code informing
async void btnlogin_onclick
method didn't haveawait
. - follow task-based asynchronous pattern.
Comments
Post a Comment