Как корректно завершить работу обычного приложения .net в контейнере Docker - PullRequest
0 голосов
/ 20 мая 2019

Я настраиваю приложение .net в контейнере Windows на основе Win2019 с каркасом .net 4.7.2.Я ищу способ корректно завершить работу контейнера, но до этого мое приложение выполнит некоторые задачи «в процессе» до остановки контейнера.Команда "docker stop" просто убивает контейнер.мое приложение основано на .net 4.7.2, а НЕ .Net Core.

это пример того, что я видел при использовании .Net Core:

private static readonly AutoResetEvent _closing = new AutoResetEvent(false);

static void Main(string[] args)
{
    AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
    AssemblyLoadContext.Default.Unloading += Default_Unloading;

    Task.Factory.StartNew(() =>
    {
        while (true)
        {
            Console.WriteLine(DateTime.Now.ToString());
            Thread.Sleep(1000);
        }
    });
    Console.CancelKeyPress += new ConsoleCancelEventHandler(OnExit);
    _closing.WaitOne();
}

private static void Default_Unloading(AssemblyLoadContext obj)
{
    Console.WriteLine("unload");
}

private static void CurrentDomain_ProcessExit(object sender, EventArgs e)
{
    Console.WriteLine("process exit");
}

protected static void OnExit(object sender, ConsoleCancelEventArgs args)
{
    Console.WriteLine("Exit");
    _closing.Set();
}

Так как AssemblyLoadContext поддерживаетсятолько в .Net Core я пытался использовать только вариант AppDomain, но безуспешно.Контейнер всегда отключен, и у него нет возможности контролировать его время и закрывать мои задачи «в процессе».

1 Ответ

0 голосов
/ 20 мая 2019

Я нашел ответ здесь: Событие выхода из консольного приложения .NET

при вызове «docker stop -t [timoutTime in seconds]» запускает событие Ctrl + C, котороевызвать мой код очистки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...