首页 > 解决方案 > .NET Core 任务在 OpenVZ 虚拟服务器上不起作用

问题描述

我注意到 .NET Core 3Task无法在我的基于 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说的。我相应地更改了问题的标题。

知道问题可能是什么吗?

标签: c#.net-coretaskopenvzvirtual-server

解决方案


如果能够使用 asynchronous 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 - 异步编程的最佳实践


推荐阅读