Как сохранить консольное приложение .NET?

В качестве значения вы можете иметь словарь с коллекцией (или любым другим типом / классом). Таким образом, у вас есть один ключ, и вы сохраняете значения в своей коллекции.

94
задан intoOrbit 6 April 2010 в 17:30
поделиться

6 ответов

вы всегда хотите предотвратить использование циклов while, особенно когда вы заставляете код повторно проверять переменные. Это тратит ресурсы ЦП и замедляет работу вашей программы.

Я бы определенно сказал первое.

60
ответ дан 24 November 2019 в 05:53
поделиться

Вы можете сделать так (и удалить обработчик события CancelKeyPress) :

while(!_quitFlag)
{
    var keyInfo = Console.ReadKey();
    _quitFlag = keyInfo.Key == ConsoleKey.C
             && keyInfo.Modifiers == ConsoleModifiers.Control;
}

Не уверен, что это лучше, но мне не нравится идея вызова Thread.Sleep в цикле... Я думаю, что чище будет блокировать ввод пользователя.

13
ответ дан 24 November 2019 в 05:53
поделиться

Из двух вариантов первый лучше

_quitEvent.WaitOne();

потому что во втором случае поток просыпается каждую миллисекунду и превращается в прерывание ОС, что дорого

.
2
ответ дан 24 November 2019 в 05:53
поделиться

Вы должны делать это так же, как если бы вы программировали службу Windows. Вы бы никогда не использовали оператор while, вместо этого вы использовали бы делегат. WaitOne () обычно используется при ожидании удаления потоков - Thread.Sleep () - не рекомендуется - думали ли вы об использовании System.Timers.Timer, используя это событие для проверки события завершения работы?

0
ответ дан 24 November 2019 в 05:53
поделиться

В качестве альтернативы, более простое решение:

Console.ReadLine();
27
ответ дан 24 November 2019 в 05:53
поделиться

Кажется, что вы усложняете задачу. Почему бы просто не присоединиться к потоку после того, как вы подали сигнал о его остановке?

class Program
{
    static void Main(string[] args)
    {
        Worker worker = new Worker();
        Thread t = new Thread(worker.DoWork);
        t.IsBackground = true;
        t.Start();

        while (true)
        {
            var keyInfo = Console.ReadKey();
            if (keyInfo.Key == ConsoleKey.C && keyInfo.Modifiers == ConsoleModifiers.Control)
            {
                worker.KeepGoing = false;
                break;
            }
        }
        t.Join();
    }
}

class Worker
{
    public bool KeepGoing { get; set; }

    public Worker()
    {
        KeepGoing = true;
    }

    public void DoWork()
    {
        while (KeepGoing)
        {
            Console.WriteLine("Ding");
            Thread.Sleep(200);
        }
    }
}
3
ответ дан 24 November 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: