Aplikace se sama ukončuje při skončení všech vláken, které nejsou označené jako IsBacground. Vzhledem k tomu, že časovač pracuje ve vláknu, která na pozadí je, tak se aplikace ihned ukončí po skončení metody Main. Způsobů jak vyčkat je několik. Hlavní otázkou je, kdy chcete aplikaci ukončit? Například mě napadají tyto scénáře: - čekat na klávesu Enter - na konec metody zapsat:
Console.ReadLine()
- čekat na sestřelení aplikace - na konec metody zapsat nekonečné čekání:
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
- prováděná operace si sami určí, kdy se má aplikace ukončit (toto je váš případ):
static void Main(string[] args)
{
var exitEvent = new System.Threading.ManualResetEvent(false); // událost pro ukončení
ImageTransfer transfer = new ImageTransfer(exitEvent);
transfer.Start();
exitEvent.WaitOne(); // čekat na událost ukončení
}
class ImageTransfer
{
EventWaitHandle exitEvent;
public ImageTransfer(EventWaitHandle exitEvent)
{
this.exitEvent = exitEvent;
timer = new System.Timers.Timer(50);
timer.Elapsed+=new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.AutoReset = true;
}
public void Start()
{
timer.Start();
}
private void timer_Elapsed(object obj, System.Timers.ElapsedEventArgs e)
{
MakeSoameAction();
if (IsFinished())
{
timer.Stop(); //aplikace uz muze skoncit
this.exitEvent.Set(); // muzeme skoncit
}
}
}
Hlavní vlákno zde čeká (exitEvent.WaitOne()) na nastavení událost (exitEvent.Set()). Bude tak ukončeno hned, jak to určí třída pro zpracování.
|