. NET Основные задачи не работают на виртуальном сервере OpenVZ - PullRequest
0 голосов
/ 20 января 2020

Я заметил, что. NET Core 3 Task s не работают на моих виртуальных серверах на основе Ubuntu 18.04 (провайдерами являются Strato.de и HostEurope.de).

Вот очень основа c тестовая программа:

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 имеют ту же проблему, они почти никогда не запускаются (иногда, но очень редко, они делают).

EDIT: Оба виртуальных сервера работают на OpenVZ , в по крайней мере, это то, что говорит systemd-detect-virt. Я изменил название вопроса соответственно.

Есть идеи, в чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Если вы можете использовать асинхронный 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 соответственно. При асинхронности c, go до конца.

Ссылка Асинхронное / ожидание - лучшие практики асинхронного программирования

0 голосов
/ 23 января 2020

Это известная ошибка, которая будет исправлена ​​в. NET Core 3.1.2

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

...