无法在Linux上使用.Net Core等待Task.Delay

6

这段非常简单的代码在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中使用System.Threading.Timer(通过services.AddHostedService()注册)时,我开始遇到问题。定时器的回调函数也没有被调用。这种情况只发生在Linux下,而Windows可以很好地运行。
有人有想法如何解决这个问题吗?
更新:根据Herohtar的评论,我在Windows子系统Ubuntu上进行了测试。那里也能正常工作。现在我怀疑我的主机提供商(Strato.de的虚拟服务器)的Linux映像存在某些问题。
有人能想出Linux中可能导致这些问题的限制吗?

3
我似乎无法重现这个问题。在我的 Ubuntu 18.04.3 上,使用 .NET Core 3.0 运行时,这段代码可以正常运行。 - Herohtar
1
在Linux上,.net core的计时器完全由托管代码处理(https://github.com/dotnet/runtime/blob/master/src/libraries/System.Private.CoreLib/src/System/Threading/TimerQueue.Portable.cs)。我唯一看到依赖于操作系统的是`Environment.TickCount64`。我知道在某些虚拟化环境中可能会出现时钟问题,所以这可能是罪魁祸首。不幸的是,看起来strato.de没有免费的服务器,所以我无法深入挖掘 :/ - Kevin Gosse
dotnet --info 显示我只安装了运行时:已安装的.NET Core运行时: Microsoft.AspNetCore.App 3.1.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 3.1.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]为了获取更多信息,我尝试安装SDK。令我惊讶的是,该安装也卡住了! - ozerfrettelter
你能否进行一个简单的测试,例如部署一个控制台应用程序,运行while (true) { Console.WriteLine(Environment.TickCount64); Thread.Sleep(1000); },并查看该值平均增加了多少? - Kevin Gosse
当然。它运行并增加了1000,就像这样104352025 104353026 104354026。 - ozerfrettelter
显示剩余4条评论
1个回答

1

从Strato获得响应后,我可以在此发布自己问题的答案:Strato正在使用Virtuozzo进行虚拟化。出于安全原因,他们还禁用了一些功能,因此无法在那里运行.Net core。

对于所有遇到相同问题的人:您无法在Strato Linux V服务器上使用.Net core。

感谢每个试图帮助的人!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接