【问题标题】:Async task is stuck in a deadlock异步任务陷入死锁
【发布时间】:2017-07-08 13:20:29
【问题描述】:

我正在尝试在 xamarin Studio (c#) 中执行异步任务,但我缺少关于 async/await 的一些内容。这是我的代码。它永远不会完成这个功能。

public static async Task<string> AsyncTask()
        {
            using (var client = new HttpClient())
            {
                var values = new Dictionary<string, string>
            {
                { "thing1", "this is the second time" },
                { "thing2", "world" }
            };

                var content =  new  FormUrlEncodedContent(values);

                var response = await client.PostAsync(DATA_SOURCE, content);

                var responseString = await response.Content.ReadAsStringAsync();
                System.Diagnostics.Debug.WriteLine("PART 2:" + responseString);
                _json = responseString;
                return _json;
            }

        }

【问题讨论】:

  • 显示调用上述函数的代码。在堆栈更高的地方有一个阻塞调用,例如“.Result.Wait”,检查它们是否存在。

标签: xamarin async-await


【解决方案1】:

看来您可能是从 WPF 或 WinForms 上下文中调用它的。如果我是正确的,以下适用并且是常见的混淆来源:

当您等待异步方法调用时,默认情况下它将在捕获的上下文(如果从 UI 代码调用,则为 UI 上下文)继续。在这种情况下,UI 上下文很忙并且也被捕获,因此会发生死锁。

您应该做的是将 .ConfigureAwait(false) 添加到每个等待的方法调用中。

async MethodCall(...).ConfigureAwait(false);

这将允许不同的上下文在异步调用完成后恢复方法的执行,从而避免死锁。注意:这对于所有库代码都以这种方式工作尤其重要,以便从 UI 上下文调用是安全的。

许多人希望这是默认行为,而您可以选择强制它在相同的上下文中恢复,但保持向后兼容性排除了该决定。

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2014-12-09
    • 2020-04-25
    • 2019-01-13
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多