2017-02-19 7 views
1

С типичным консольным приложением, использующим таймеры, мы можем использовать «Console.ReadLine()», чтобы предотвратить закрытие приложения. Есть ли эквивалентное решение, когда тип вывода консольного приложения - «Приложение Windows»?Использование System.Timers с консольным приложением и типом вывода «Приложение Windows»

Боковое примечание: служба Windows не является решением в этом случае, поскольку я запускаю процессы.

class Program 
{   
    private static Timer _Timer;  

    static void Main(string[] args) 
    { 
     SetupTimer();       
    } 

    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    {   
     Process.Start(@"C:\WINDOWS\system32\notepad.exe"); 
    } 

    private static void SetupTimer() 
    { 
     _Timer = new Timer(); 
     _Timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     _Timer.Interval = 3000; 
     _Timer.Enabled = true; 
    } 
} 

enter image description here

+1

приложения окна есть окно так, пока окно не закрываются, таймер будет работать. Закрытие окна - это пользовательская команда, которая закрывает окно так же, как ввод ключа в консоль - это команда закрытия консоли. Не уверен, что вы спрашиваете здесь. – CodingYoshi

+0

@CodingYoshi См. Здесь. У моего приложения нет окна для закрытия. http://stackoverflow.com/questions/2686289/how-to-run-a-net-console-app-in-the-background – ManxJason

+2

Непонятно, почему вы хотите использовать таймер. У вас нет интерфейса, чтобы оставаться счастливым, поэтому Thread.Sleep() может это сделать. –

ответ

1

Чтобы достичь того, чего вы хотите:

using System; 
using System.Diagnostics; 
using System.Timers; 

public class Program 
{ 
    private static Timer _Timer; 
    private static bool Launched = false; 
    static void Main(string[] args) 
    { 
     SetupTimer(); 
     WaitUntilItIsLaunched: 
     if (!Launched) 
     { 
      System.Threading.Thread.Sleep(100); 
      goto WaitUntilItIsLaunched; 
     } 
    } 

    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Process.Start(@"C:\WINDOWS\system32\notepad.exe"); 
     Launched = true; 
    } 

    private static void SetupTimer() 
    { 
     _Timer = new Timer(); 
     _Timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     _Timer.Interval = 3000; 
     _Timer.Enabled = true; 
    } 
} 
+0

Итак, мы просто постоянно спим нить, пока мое условие не будет выполнено. Не очень элегантный, но спасибо. – ManxJason

+0

Вы можете использовать Tasks and Thread control, но вам было бы труднее понять. Но это не плохое решение. – user7358693

-1

С меньшим количеством строк кода:

using System; 
using System.Diagnostics; 
using System.Threading.Tasks; 
using System.Timers; 
public class Program 
{ 
    static void Main(string[] args) 
    { 
     int MsToWait = 3000; 
     int MsElapsed = 0; 
     WaitLaunch: 
     System.Threading.Thread.Sleep(100); 
     MsElapsed += 100; 
     if (MsElapsed >= MsToWait) 
     { 
      Process.Start(@"C:\WINDOWS\system32\notepad.exe"); 
      return; 
     } 
     else 
      goto WaitLaunch; 
    } 
} 
+0

Не используйте 'goto', когда вы можете использовать, вы можете использовать обычный цикл и иметь более читаемый код. – Phil1970

+0

Также не отправляйте несколько ответов на один и тот же вопрос. – Phil1970

+0

Я выложу столько ответов, сколько хочу, и они значительно отличаются. Если вы считаете, что goto является невыносимым, тогда вы должны дать полный ответ, вы не помогаете никому здесь, если вы этого не сделаете. В этом случае goto гораздо более прозрачен, чем таймер. – user7358693

0

Или еще более компактный код:

using System; 
using System.Diagnostics; 
using System.Threading; 
public class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime LaunchAt = DateTime.Now.AddSeconds(3); 
     WaitLaunch: 
     Thread.Sleep(100); 
     if (DateTime.Now >= LaunchAt) 
      Process.Start(@"C:\WINDOWS\system32\notepad.exe"); 
     else 
      goto WaitLaunch; 
    } 
} 
+0

The Thread.Sleep (100); является важной частью кода, потому что без него процессор продолжает делать цикл миллионы раз в секунду, заставляя процессор использовать 100% его емкости. – user7358693

0

Если вы хотите запустить несколько программ, в разное время и ждать всех их запуск:

using System; 
using System.Diagnostics; 
using System.Threading; 
using System.Collections; 
using System.Collections.Generic; 
public class Program 
{ 
    static Dictionary<string,DateTime> ExecutablesToLaunch = new Dictionary<string,DateTime>(); 
    static List<string> ExecutablesLaunched = new List<string>(); 
    static void Main(string[] args) 
    { 
     ExecutablesToLaunch.Add(@"C:\WINDOWS\system32\notepad.exe", DateTime.Now.AddSeconds(3)); 
     ExecutablesToLaunch.Add(@"C:\WINDOWS\system32\control.exe", DateTime.Now.AddSeconds(5)); 
     ExecutablesToLaunch.Add(@"C:\WINDOWS\system32\calc.exe", DateTime.Now.AddSeconds(10)); 

     WaitAllToLaunch: 
     if (ExecutablesToLaunch.Count == ExecutablesLaunched.Count) 
      return; 
     Thread.Sleep(100); 
     foreach (var Executable in ExecutablesToLaunch) 
     { 
      if (ExecutablesLaunched.Contains(Executable.Key)) 
       continue; 
      if (DateTime.Now >= Executable.Value) 
      { 
       Process.Start(Executable.Key); 
       ExecutablesLaunched.Add(Executable.Key); 
      } 
      else 
       goto WaitAllToLaunch; 
     } 
    } 

} 
Смежные вопросы