【发布时间】: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