.NET Core 任务无法在 OpenVZ 虚拟服务器上运行

.NET Core Tasks not working on OpenVZ virtual server

我注意到 .NET Core 3 Task 无法在基于 Ubuntu 18.04 的虚拟服务器上运行(供应商是 Strato.de 和 HostEurope.de)。

这是一个非常基本的测试程序:

static void Main(string[] args) {
    Console.WriteLine("Hello");
    Task.Delay(2000).ContinueWith(_ => Console.WriteLine("Fire"));
    Thread.Sleep(5000);
    Console.WriteLine("Exit");
}

应用程序应立即打印 "Hello",2 秒后 "Fire",最后 "Exit"。 这在我的 Windows 电脑和我的 Ubuntu 18.04 电脑上运行良好。

但是当我 运行 虚拟服务器上的代码时,第二条消息永远不会打印出来。 Threading.TimerTimers.Timer 也有同样的问题,他们几乎从不开火(有时,但很少,他们会开火)。

编辑:两个虚拟服务器 运行 在 OpenVZ 上,至少 systemd-detect-virt 是这么说的。我相应地更改了问题的标题。

知道问题出在哪里吗?

如果能够使用异步Main,则考虑以下

public static async Task Main(string[] args) {
    Console.WriteLine("Hello");
    var task1 = Task.Run(async () => {
        await Task.Delay(2000);
        Console.WriteLine("Fire");
    });
    var task2 = Task.Delay(5000);
    await Task.WhenAll(task1, task2);
    Console.WriteLine("Exit");
}

避免混合异步调用和阻塞调用,例如 Task.DelayThread.Sleep。如果要异步,请一直走。

引用Async/Await - Best Practices in Asynchronous Programming

这是一个已知错误,将在 .NET Core 3.1.2 中修复

https://github.com/dotnet/runtime/issues/2070 and https://github.com/dotnet/coreclr/issues/26873