Механизм выключения консоли


Я пытаюсь создать effiecent способ заткнуть мой консольное приложение. Для этого у меня есть цикл while в методе Main моя программа ждет запрос на выключение.

var rebootAfterClose = false;

while (true)
{
    var input = Console.ReadKey();

    if (input.Key == ConsoleKey.C && input.Modifiers == ConsoleModifiers.Control)
    {
        break;
    }

    if (input.Key != ConsoleKey.R || input.Modifiers != ConsoleModifiers.Control)
    {
        continue;
    }

    rebootAfterClose = true;

    break;
}

Server?.Stop(rebootAfterClose);

Тогда у меня этих методов, остановка-одна, которая вызывается, распоряжаться вызывается в Stop().

public void Dispose()
{
    if (Disposing)
    {
        return;
    }

    Disposing = true;

    BaseHandler.PlayerHandler.Dispose();

    ConsoleUpdater.Dispose();
    SocketHandler.Dispose();
}

public void Stop(bool restart)
{
    Task.Factory.StartNew(() =>
    {
        var shutdownMessage = PlusEnvironment.GetLanguageManager().TryGetValue("server.shutdown.message");
        var shutdownPacket = new BroadcastMessageAlertComposer(shutdownMessage);

        Program.Server.BaseHandler.PlayerHandler.SendPacketToPlayers(shutdownPacket);

        ConsoleUpdater.Stop();

        Console.Clear();
        Console.WriteLine();
        Console.Title = "Stopping...";

        Logger.Warn("Server is " + (restart ? "rebooting" : "shutting down") + "....");

        Thread.Sleep(5000);

        // not sure if I should use this instead? : Task.Delay(5000);

        Dispose();

        if (restart)
        {
            Process.Start(Assembly.GetExecutingAssembly().Location);
        }

        Environment.Exit(0);
    });
}

Я использовал нить, поскольку я не хочу, чтобы заблокировать поток с 5 секундной задержкой. В данный момент я хочу просто порядок этот механизм, как я очень новой для многопоточности и просто хочу знать, если я сделал хорошо, я признателен всем, кто вносит свой комментарий или ответ.

Еще одна вещь меня беспокоит-это то время как (правда) петли в мой основной метод, есть ли лучший способ сделать это? Мне нужно, чтобы избежать закрытия консольного приложения на любую другую клавишу, кроме тех, что в цикле while (СTR+С], или сочетание клавиш Ctrl+р), но я не могу придумать лучшего способа сделать это.



234
2
задан 26 января 2018 в 06:01 Источник Поделиться
Комментарии