Zabránění ukončení konzolové aplikace   otázka

C#

Dobrý den,

V konzolové aplikaci spustím časovač, od kterého bych chtěl, aby v pravidelných intervalech vykonával nějakou činnost.

Aplikace se chová tak, že po spuštění se ihned ukončí,aniž by odcházelo k odpalován časovače.

Jak mám prosím zabránit tomu, aby se aplikace ukončila, aniž by neproběhl požadovaný počet cyklů?

Ten časovač je tam proto, aby aplikace nezatěžovala PC, vím, že alternativou je použít vlákno.

 static void Main(string[] args)
        {
            ImageTransfer transfer = new ImageTransfer();
            transfer.Start();           
        }   

class ImageTransfer
    {
public ImageTransfer()
        {          
            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

        }
}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

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í.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji,

poslední uvedené řešení je přesně to co potřebuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback