C# .NET核心任务在OpenVZ虚拟服务器上不工作

C# .NET核心任务在OpenVZ虚拟服务器上不工作,c#,.net-core,task,openvz,virtual-server,C#,.net Core,Task,Openvz,Virtual Server,我注意到.NETCore3Tasks在我的基于Ubuntu18.04的虚拟服务器上不起作用(提供程序是Strato.de和HostEurope.de) 下面是一个非常基本的测试程序: static void Main(string[] args) { Console.WriteLine("Hello"); Task.Delay(2000).ContinueWith(_ => Console.WriteLine("Fire")); Thread.Sleep(5000)

我注意到.NETCore3
Task
s在我的基于Ubuntu18.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.Timer
Timer.Timer
也有同样的问题,它们几乎从不点火(有时,但很少点火)

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


>问题是什么?

< P>如果能够使用异步<代码>主< /代码>,那么考虑下面的

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.Delay
Thread.Sleep
。如果要异步,请一直进行


参考

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


请参见和

如果错误,请给我一个更正的示例。我不明白为什么async应该修复它。我已经检查了虚拟服务器上是否没有足够的可用线程(使用
ThreadPool
的方法),但这似乎不是问题所在:
Min threads:6*worker,6*completion;最大线程数:32767*工作线程,完成1000*线程;可用线程:32767*工作者,1000*完成
此问题不会出现在Azure托管的Ubuntu 18.04服务器上(底层虚拟化是“Microsoft…”而不是“OpenVM”)。不幸的是,这不是我问题的解决方案。在两个虚拟服务器上运行代码时,只打印“Hello”,然后程序“冻结”,因为任务似乎永远不会运行。