DeadlockUsingAsyncandAwait我想在我的程序中实现的是下面的callstack/workflow:dispatch()authorize()httpPost()我的想法是,httpPost()会是异步的,而其他2个方法仍然是异步的。但是,出于某种原因,除非我做2+3,否则它对我不起作用。异步。可能我还是有些误会。据我了解,我可以a)在调用异步方法时使用await-关键字(这将暂停该方法并在异步方法完成后继续),或者b)省略await-关键字并调用异步的任务。返回值的Result方法,它将阻塞直到有结果可用。让我告诉你工作的例子:privateintdispatch(stringoptions){intres=authorize(options).Result;返回资源;}staticasyncprivateTaskauthorize(stringoptions){stringvalues=getValuesFromOptions(options);KeyValuePairresponse=awaithttpPost(url,values);返回0;}publicstaticasyncTaskhttpPost(stringurl,Listparameters){varhttpClient=newHttpClient(newHttpClientHandler());HttpResponseMessageresponse=awaithttpClient.PostAsync(url,newFormUrlEncodedContent(parameters));intcode=(int)response.StatusCode;响应.EnsureSuccessStatusCode();字符串responseString=awaitresponse.Content.ReadAsStringAsync();返回新的键值对(代码,响应字符串);让我告诉你非工作的例子:privateintdispatch(stringoptions){intres=authorize(options).Result;返回资源;}staticprivateintauthorize(stringoptions){stringvalues=getValuesFromOptions(options);任务响应=httpPost(网址,值);doSomethingWith(response.Result);//执行将永远挂在这里return0;}publicstaticasyncTaskhttpPost(stringurl,Listparameters){varhttpClient=newHttpClient(newHttpClientHandler());HttpResponseMessageresponse=awaithttpClient.PostAsync(url,newFormUrlEncodedContent(parameters));intcode=(int)response.StatusCode;响应.EnsureSuccessStatusCode();字符串responseString=等待responseAsString.Content。);返回新的键值对(代码,响应字符串);我还尝试使所有3种方法都非异步,并将httpPost的await替换为httpPosts,但它永远挂起有人可以启发我并解释我的错误是什么吗?您有一个SynchronizationContext,并且在等待时捕获该上下文,以便继续可以在该上下文中运行您正在启动一个异步任务,该任务计划在稍后的某个时间点在主上下文中运行。主上下文中的代码然后对异步操作执行阻塞等待,直到异步操作完成。无法安排延续,因为上下文正忙于等待延续。经典的僵局。这就是为什么像您在第一个示例中所做的那样“一直异步”很重要。在第二个示例中,有一些hack可以解决死锁,但这仍然不是您应该做的事情。异步的全部意义在于避免阻塞你的线程。如果你只是在阻塞等待任务,那么你就违背了异步的目的。除非你别无选择,否则让一切异步,或者不要。以上就是C#学习教程的全部内容:死锁使用异步和等待分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: