繁体   English   中英

如何验证异步方法和HttpClient.PostAsync调用中的死锁?

[英]How can I verify a deadlock in my async to sync method and HttpClient.PostAsync calls?

我的程序陷入僵局,但无法弄清楚为什么以及如何解决它。

简洁版本:

async sync方法锁定等待一个异步调用,该调用再调用另一个,依此类推,直到HttpClient.PostAsync调用。 http调用永远不会发生,至少它不会到达服务器(我也拥有)。 客户端中没有错误。 我的主要问题在本SO问题的末尾。 谢谢!

较长版本:

我知道提出死锁很容易,我们必须小心。 我试图遵循以下建议:1.将异步传播到所有方法,并2.尽可能/有意义地使用ConfigureAwait(false) (我认为主要的提倡者是Stephen Cleary,他是他的博客,并在我读过很多文章的许多SO中对此进行了回答)。

好吧,我的程序...不幸的是,我无法在此处发布完整的示例代码,这相当长; 我将其描述为一个调用异步方法B的同步方法A ,该方法B调用了另一个异步方法,该方法又调用了另一个异步方法,等等。最后一个异步调用最终是HttpClient.PostAsync

程序在await HttpClient.PostAsync处停止。 另外,Http帖子永远不会触发(我拥有目标服务器,在这种情况下,它永远不会收到请求)。 (我仔细检查了uri等)。

结果,同步方法锁定等待B的异步任务完成,而这永远不会发生。 A看起来是这样的:

public Byte[] A()
{
var task = BAsync();
return task.GetAwaiter().GetResult();
}

我以这种方式使用同步,因为他的方法不需要上下文,并且我看到了Nito的Stephen建议的方法是使用此方法实现的。 (我也尝试了task.Result而不是相同的结果)。

http post调用的代码为:

private static async Task<HttpResponseMessage> PostAsync(Uri serverUri, HttpContent httpContent)
{
var client = new HttpClient();
return await client.PostAsync(serverUri, httpContent).ConfigureAwait(false);
}

应用程序的UI冻结。 这是WP8应用。 在这方面,按钮不对Click事件做出反应,但ScrollViews仍然有效。 这是另一个问题的主题,但我希望将此细节包括在问题中。

我什至不确定自己有死锁,还是HttpClient错误? (我不这么认为,相同的方法正在同一应用程序的其他工作流中工作)。

我试图验证是否存在死锁,并使用了VS的线程调试器窗口,但似乎只有主线程处于活动状态。 我还尝试了所有其他类型的调试器窗口,但没有任何提示。

我的主要问题是:

  1. 我有僵局吗?
  2. 如何验证(也许使用VS)我确实有死锁?
  3. 它在Client.PostAsync吗? 如果是,为什么以及如何解决?
  4. 如果没有,请提出任何想法。

编辑:使用MethodInfo.Invoke反射调用方法A 我相信现在这是问题的一部分。

我相信您会遇到僵局,尽管我不确定如何证明这一僵局。

大多数平台上的HttpClient在内部正确使用ConfigureAwait(false) ,但在少数平台上则没有。 我相信WP8就是其中之一。 这意味着您可以正确使用所有需要的ConfigureAwait(false) ,但是HttpClient仍然会导致死锁。

最好的解决方案是始终保持异步状态。 但是,如果那不可能,那么有两种选择可供考虑:

  1. HttpClient工作推送到后台线程。

     public Byte[] A() { var task = Task.Run(() => BAsync()); return task.GetAwaiter().GetResult(); } 
  2. 在前台线程上建立嵌套循环以执行任何异步工作。

     public Byte[] A() { return AsyncContext.Run(() => BAsync()); } 

    请注意, AsyncContext来自我的AsyncEx库 相信 AsyncContext应该可以在WP8上使用,但是我实际上并没有在该平台上使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM