C# .NET核心任务在OpenVZ虚拟服务器上不工作
我注意到.NETCore3C# .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)
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”,然后程序“冻结”,因为任务似乎永远不会运行。