2016-04-18 6 views
0

Ich habe einen kleinen Windows-Dienst geschrieben, der XML-Datei lesen wird, die von einer Windows-Anwendung erstellt und an einem bestimmten Speicherort gespeichert wird. Die XML-Datei enthält mehrere Startzeiten, Endzeiten und Ausführungszeiten, auf denen mein Windows-Dienst ein Excel-Blatt erstellt, indem er die SQL Server-Datenbank abfragt. Mein Problem ist in der Mitte meiner Code-Ausführung thread.sleep wird aufgerufen und mein Code wird nicht vollständig ausgeführt.wie man Timer und thread.sleep so konfiguriert, dass thread.sleep warten wird, bis der ganze Code ausgeführt wird

mein Program.cs Code:

namespace RepService 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
#if(!DEBUG) 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new Service1() 
      }; 
      ServiceBase.Run(ServicesToRun); 
#else 
      Service1 myServ = new Service1(); 
      myServ.Start(); 
      //Set the Thread to sleep 

      Thread.Sleep(60000); 
      //Call the Stop method-this will stop the Timer. 
      myServ.Stop(); 
#endif 
     } 
    } 
} 

meine Service1.cs Datei folgenden Code:

public Service1() 
     { 
      _aTimer = new System.Timers.Timer(30000); 
      _aTimer.Enabled = true; 
      _aTimer.Elapsed += new System.Timers.ElapsedEventHandler(_aTimer_Elapsed); 
      InitializeComponent(); 
} 
void _aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     {//huge code to be executed 
} 

wie meine Timer und Thread.Sleep konfigurieren, so dass ich meinen Code Skipping vermeiden kann Ausführung wegen thread.sleep. Ich möchte meinen Dienst alle 15 Minuten ausführen. Der Aufgabenplaner kann nicht nach Bedarf verwendet werden.

+0

Es gibt nicht viel Zeigen Sie, dass Sie nur eine Minute Zeit haben, Ihren Code zu debuggen. Wie wäre es mit einer Woche? Verwenden Sie Debug> Beenden Sie das Debuggen, wenn Sie bereit sind, nach Hause zu gehen. –

+0

threa.sleep ist nur auf eine Minute eingestellt, aber wie kann ich es richtig einstellen? Ich weiß nicht – Tan

Antwort

0

Führen Sie in einem Rückruf Ihrer Service-Methode

0

ersetzen Sie die Zeile Thread.Sleep(60000); mit await Task.Delay(60000); Thread.Sleep?

+0

Wie und wo ich hinzufügen sollte, ich weiß nicht, wo ich die Vorschläge hinzufügen soll – Tan

0

Persönlich benutze ich nie Thread.Sleep(), weil Sie nicht schnell aus ihnen herauskommen können (wie beim Herunterfahren); Ich würde empfehlen, AutoResetEvent für die "Schlaf" -Funktionalität zu verwenden und sie zu verwenden, um zu sehen, wenn der andere Code fertig ist. Sie können etwas tun:

public System.Threading.AutoResetEvent doneFlag = new System.Threading.AutoResetEvent(false); // used to signal when other work is done 

.... 

Service1 myServ = new Service1(); 
myServ.Start(); 
if(doneFlag.WaitOne(SOME_TIMEOUT)) 
{ 
    // doneFlag was set, so other code finished executing 
} 
else 
{ 
    // doneFlag was not set, SOME_TIMEOUT time was exceeded. Do whatever you want to handle that here 
} 
.... 
void _aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    //huge code to be executed 
    doneFlag.Set(); // this will trigger the previous code pretty much immediately to continue 
} 

Hoffentlich ist das, was Sie suchen. Lass es mich wissen, wenn du Fragen hast!

PS: Ich bin mir nicht sicher, wer weiter geht um Fragen zu bewerten. Vor allem, weil es wirklich keine Erklärung dafür gibt, warum jemand es abgelehnt hat. Leute sollten versuchen, hilfreicher zu sein, als nur ein Idiot zu sein und dann wegzulaufen. Nenne es, um den Idioten entgegenzuwirken ...