В качестве значения вы можете иметь словарь с коллекцией (или любым другим типом / классом). Таким образом, у вас есть один ключ, и вы сохраняете значения в своей коллекции.
вы всегда хотите предотвратить использование циклов while, особенно когда вы заставляете код повторно проверять переменные. Это тратит ресурсы ЦП и замедляет работу вашей программы.
Я бы определенно сказал первое.
Вы можете сделать так (и удалить обработчик события CancelKeyPress
) :
while(!_quitFlag)
{
var keyInfo = Console.ReadKey();
_quitFlag = keyInfo.Key == ConsoleKey.C
&& keyInfo.Modifiers == ConsoleModifiers.Control;
}
Не уверен, что это лучше, но мне не нравится идея вызова Thread.Sleep
в цикле... Я думаю, что чище будет блокировать ввод пользователя.
Из двух вариантов первый лучше
_quitEvent.WaitOne();
потому что во втором случае поток просыпается каждую миллисекунду и превращается в прерывание ОС, что дорого
.Вы должны делать это так же, как если бы вы программировали службу Windows. Вы бы никогда не использовали оператор while, вместо этого вы использовали бы делегат. WaitOne () обычно используется при ожидании удаления потоков - Thread.Sleep () - не рекомендуется - думали ли вы об использовании System.Timers.Timer, используя это событие для проверки события завершения работы?
В качестве альтернативы, более простое решение:
Console.ReadLine();
Кажется, что вы усложняете задачу. Почему бы просто не присоединиться
к потоку после того, как вы подали сигнал о его остановке?
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);
}
}
}