【问题标题】:Difference between .GetAwaiter() and ConfigureAwait() [closed].GetAwaiter() 和 ConfigureAwait() 之间的区别 [关闭]
【发布时间】:2015-11-21 12:42:50
【问题描述】:

谁能告诉我GetAwaiter()ConfigureAwait(false) 之间的区别。

它们都用于 Async 方法来解决死锁情况,ConfigureAwait 用于在不使用同步上下文的情况下完成任务。我正在寻找可以使用GetAwaiter() 和使用ConfigureAwait(false) 的场景。

我听说如果它是我正在构建的库,那么我需要使用ConfigureAwait(false) 来生成等待任务的可配置等待对象。我可以在 Unittest 案例项目中使用 ConfigureAwait 还是应该使用 GetAwaiter() 来获取等待任务。

【问题讨论】:

  • 您的问题同时过于宽泛,而且根本不清楚。这两种方法做的事情完全不同;您认为除此之外还有什么“差异”值得一问? "解决死锁情况";确实,正确使用任何一种方法都可以避免死锁,但这不像你从一些随机死锁开始,调用其中一种方法,然后,Bob 是你的叔叔,死锁就解决了。跨度>

标签: c# async-await


【解决方案1】:

摘自 MSDN 文档

Task.GetAwaiter 获取用于等待此任务的等待者。查看更多详情 herehere

Task.ConfigureAwaiter 配置用于等待此任务的等待者。查看更多详情 herehere

【讨论】:

  • 嗨 Nipuna,Can ContinueWith() 可以解决死锁问题,例如 .ContinueWith().GetAwaiter().getResult()
【解决方案2】:

以下是一些指导:

Async/Await - Best Practices in Asynchronous Programming

还有一个类似的问题:

Preventing a deadlock when calling an async method without using await

您可以使用Rx 在单元测试中模拟异步操作。我建议不要在单元测试中使用实际的异步;它会减慢他们的速度并阻止使用这些单元测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2014-11-28
    • 2016-08-01
    • 2011-10-07
    相关资源
    最近更新 更多