【问题标题】:Cannot await Task.Delay with .Net Core under Linux无法在 Linux 下使用 .Net Core 等待 Task.Delay
【发布时间】:2019-12-21 07:15:40
【问题描述】:

这个非常简单的代码在 Linux 下的工作方式与在我的 Windows 机器上的工作方式不同:

    class Program
    {
        async static Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            for (int i = 0; i < 5; i++)
            {
                await Task.Delay(TimeSpan.FromSeconds(1));
                Console.WriteLine("" + i);
            }

            Console.WriteLine("Bye bye");
        }
    }

这应该会产生类似的输出

Hello World

0

1

.. 

4

Bye bye

它在开发中运行良好,如果发布到 Windows。如果为 Linux 发布,它会在输出“Hello World”后挂起。 await Task.Delay() 永远不会返回。

我尝试过全新安装 Ubuntu 18 和 CentOS 7。我尝试过 ASP.Net Core 3.0 运行时和 3.1(也都是全新安装)。

此代码仅用于演示目的。最初,在 ASP.Net BackgroundService(通过 services.AddHostedService() 注册)中使用 System.Threading.Timer 时,我开始遇到问题。那里的计时器回调也没有被调用。这也只发生在 Linux 下,而 Windows 运行良好。

有人知道如何解决这个问题吗?

更新 在 Herhtar 发表评论后,我在 Windows 子系统 Ubuntu 上进行了测试。它也在那里工作。 现在我怀疑我的主机(Strato.de 上的虚拟服务器)的 Linux 映像不知何故受损。

有人能想到可能导致此类问题的 Linux 限制吗?

【问题讨论】:

  • 我似乎无法重现此问题。代码在 Ubuntu 18.04.3 上使用 .NET Core 3.0 运行时运行良好。
  • await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false) 有影响吗?如果您在一个 CPU 内核上运行并且涉及到 SynchronizationContext,则会出现这种情况。
  • 感谢克劳斯的想法!可悲的是,这并没有明显的区别。仍在等待永远......
  • Linux 上 .net 内核上的计时器完全由托管代码 (github.com/dotnet/runtime/blob/master/src/libraries/…) 处理。我看到的唯一依赖于操作系统的是Environment.TickCount64。我知道在某些虚拟化环境中可能存在时钟问题,因此这可能是罪魁祸首。不幸的是,strato.de 似乎没有免费服务器,所以我无法进一步挖掘:/
  • dotnet --info 在您的托管 Linux 上打印什么?

标签: c# linux .net-core async-await


【解决方案1】:

在收到 Strato 的回复后,我可以在此处发布我自己的问题的答案:Strato 正在使用 Virtuozzo 进行虚拟化。出于安全原因,他们还禁用了一些功能,因此 .Net 核心无法在那里运行。

对于遇到相同问题的其他所有人:您根本无法在 Strato Linux V-Server 上使用 .Net 核心。

感谢所有努力提供帮助的人!

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 2019-04-19
    • 2012-11-28
    • 2017-08-02
    • 1970-01-01
    • 2020-04-06
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多