【问题标题】:.NET Core 2.1, Manjuro Linux fails without ConfigureAwait(false).NET Core 2.1,Manjuro Linux 在没有 ConfigureAwait(false) 的情况下失败
【发布时间】:2018-08-30 09:06:35
【问题描述】:

我正在寻找可行的理论,因为我一无所知。
据我对 .NET Core 的了解,ConfigureAwait(false)not relevant. 但是,如果我不使用 ConfigureAwait(false),我的代码块会卡在 Manjuro Linux 上。它不会卡在 Ubuntu 上,也不会卡在 Windows 上。

环境

dotnet --version2.1.401
仅供参考:Manjuro Linux 是基于 Arch Linux 的(因此它也可能在 Arch 上失败)。

上下文

GitHub上的相关代码块:https://github.com/zkSNACKs/WalletWasabi/pull/636/files#r213737187

await Task.Delay(1000).ConfigureAwait(false);

我在启动外部进程之前调用此延迟,然后在延迟之后,另一个等待的异步函数尝试建立与此进程的连接(通过 SOCKS5)以检查它是否已正确启动:if (!await IsTorRunningAsync(TorSocks5EndPoint))

最后我用dotnet test从xUnit测试中调用了这个函数。

问题

关于为什么会发生这种事情的任何理论?

【问题讨论】:

  • 我不能说为什么会在这种情况下特别发生,但重要的是要注意 not related 语句仅适用于 ASP.NET Core(框架)而不是比 .NET Core(运行时)。以 .NET Core 为目标的东西完全有可能拥有 SynchronizationContext
  • 补充 Kirk 的观点,您可以使用 docs.microsoft.com/en-us/dotnet/api/… 检查当前的 SynchronizationContext 如果您不需要在延迟前释放当前线程,只需使用 Thread.Sleep
  • 感谢记录,它也适用于 Thread.Sleep

标签: async-await .net-core synchronizationcontext


【解决方案1】:

您可能知道 NetFramework 中的 Configure(await) 说不要使用来自同步上下文的信息,因此如果 .NET Core 中不存在此上下文 - 当然此函数什么也不做。

不幸的是,您在 github 中的代码已更改,因此不清楚问题所在。所以我的建议是 - 请阅读来自 Stephen Cleary 的 explanation

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2019-04-13
    • 1970-01-01
    • 2020-05-11
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多