.net - Async Await Handler Deadlock -


i'm stuck in async deadlock , can't figure out correct syntax fix it. i've looked @ several different solutions, can't seem quite figure out causing problem.

i using parse backend , trying use handler write table. handler looks like:

public class visitorsignuphandler : ihttphandler {     public void processrequest(httpcontext context)     {         //get user's name , email address         var userfullname = context.request.querystring["name"].urldecode();         var useremailaddress = context.request.querystring["email"].urldecode();          //save user's information         var tasktoken = usersignup.saveusersignup(userfullname, useremailaddress);         tasktoken.wait();         ....      }      public bool isreusable { { return false; } } } 

then calling middle tier:

public static class usersignup {     public static async task saveusersignup(string fullname, string emailaddress)     {         //initialize parse client application id , windows key         parseclient.initialize(appid, key);          //create object         var userobject = new parseobject("usersignup")                             {                                 {"userfullname", fullname},                                 {"useremailaddress", emailaddress}                             };          //commit object         await userobject.saveasync();     } } 

although seems getting stuck @ wait(). under impression wait() wait task complete, return normal operations. not correct?

you're running common deadlock problem describe on blog , in recent msdn article.

in short, await default resume async method inside of captured "context", , on asp.net, 1 thread allowed "context" @ time. when call wait, blocking thread inside context, , await cannot enter context when ready resume async method. thread in context blocked @ wait (waiting async method complete), , async method blocked waiting context free... deadlock.

to fix this, should go "async way". in case, use httptaskasynchandler instead of ihttphandler:

public class visitorsignuphandler : httptaskasynchandler {   public override async task processrequestasync(httpcontext context)   {     //get user's name , email address     var userfullname = context.request.querystring["name"].urldecode();     var useremailaddress = context.request.querystring["email"].urldecode();      //save user's information     var tasktoken = usersignup.saveusersignup(userfullname, useremailaddress);     await tasktoken;     ....    } } 

Comments

Popular posts from this blog

curl - PHP fsockopen help required -

HTTP/1.0 407 Proxy Authentication Required PHP -

c# - Resource not found error -