【问题标题】:.NET Core Tasks not working on OpenVZ virtual server.NET Core 任务在 OpenVZ 虚拟服务器上不起作用
【发布时间】:2020-05-05 23:15:00
【问题描述】:

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

知道可能是什么问题吗?

【问题讨论】:

  • 如果有错,请给我一个更正的例子。我不明白为什么 async 应该修复它。
  • 我已经检查了虚拟服务器上是否没有足够的线程可用(使用ThreadPool的方法),但这似乎不是问题:Min threads: 6 * worker, 6 * completion; Max threads: 32767 * worker, 1000 * completion; Available threads: 32767 * worker, 1000 * completion
  • 问题没有出现在Azure 托管的 Ubuntu 18.04 服务器上(底层虚拟化是“Microsoft ...”而不是“OpenVM” )。

标签: c# .net-core task openvz virtual-server


【解决方案1】:

如果能够使用异步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

【讨论】:

  • 不幸的是,这不是解决我的问题的方法。在两个虚拟服务器上运行您的代码,只打印“Hello”,然后程序“冻结”,因为任务似乎永远不会运行。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2016-10-04
    • 2017-02-07
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多