Я не совсем уверен, в чем вопрос, когда вы упоминаете службу Windows и клавишу Enter, оканчивающую ваше приложение, тогда вы упоминаете лучшую реализацию.
Во-первых, если вы запускаете его в консоли ине хотите, чтобы клавиша ввода убивала его, вы можете сделать что-то вроде
do
{
}
while (!Console.ReadLine().Equals("exit",
StringComparison.InvariantCultureIgnoreCase)
);
вместо
Console.ReadLine();
Это означает, что ваша консоль завершится только тогда, когда вы введете команду exit и нажмете Enterили если вы закроете программу, нажав кнопку x или убив процесс.
Что касается лучшей реализации, я не уверен, что это лучший метод, но я бы так и сделал, используяреализация опрашиваемого потока:
class Poll : IDisposable
{
private TimeSpan polledSpan;
WaitHandle[] handles = new WaitHandle[2];
ManualResetEvent exit = new ManualResetEvent(false);
Thread thread;
public Poll(int polledTime)
{
polledSpan = new TimeSpan(0, 0, polledTime);
thread = new Thread(new ThreadStart(Start));
thread.Start();
}
private void Start()
{
AutoResetEvent reset = new AutoResetEvent(false);
handles[0] = reset;
handles[1] = exit;
bool run = true;
while (run)
{
int result = WaitHandle.WaitAny(handles,
(int)polledSpan.TotalMilliseconds,
false);
switch(result)
{
case WaitHandle.WaitTimeout:
run = StuffToDo();
break;
case 1:
case 0:
run = false;
break;
}
}
}
private bool StuffToDo()
{
try
{
Console.WriteLine("Test");
return true;
}
catch
{
return false;
}
}
public void Dispose()
{
exit.Set();
if (thread != null)
{
thread.Join(10000);
}
exit = null;
handles = null;
}
}
и в основном методе
Poll p = new Poll(1);
do
{
}
while (!Console.ReadLine().Equals("exit",
StringComparison.InvariantCultureIgnoreCase));
p.Dispose();