代码之家  ›  专栏  ›  技术社区  ›  Andi

.NET核心任务不适用于虚拟化Linux平台

  •  0
  • Andi  · 技术社区  · 5 年前

    我注意到.NET核心3 Task

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

    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 Timers.Timer 有同样的问题,他们几乎从不开火(有时,但很少,他们会)。

    开放空间 ,至少这是 systemd-detect-virt 说。我相应地更改了问题的标题。

    知道问题出在哪里吗?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Nkosi    5 年前

    如果能够使用异步 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.Delay Thread.Sleep 分别是。如果要异步运行,请一直运行。

    参考 Async/Await - Best Practices in Asynchronous Programming

        2
  •  0
  •   Andi    5 年前
    推荐文章