2016-06-06 15 views
3

Ich habe einen C# Windows-Dienst, der verschiedene Aufgaben ausführt. Es funktioniert perfekt auf meinem lokalen System, aber sobald ich es auf meinem Produktserver starte, führt es keine bestimmte Aufgabe auf ihm aus. DieseSystem.Threading.Task nicht in der Produktionsumgebung

ist, wie mein Service strukturiert:

public static void Execute() 
{ 
     try 
     { 
      // .... some work .... 
      foreach (DataRow dr in dt.Rows) 
      { 
       string cc = dr["ccode"].ToString(); 
       Task objTask = new Task(delegate { RequestForEachCustomer(cc); }); 
       objTask.Start(); 
      } 
     } 
     catch (Exception ex) 
     { 
      // Logging in DB + Text File 
     } 
} 

public static void RequestForEachCustomer(object cc) 
{ 
    try 
    { 
     // .... some work .... 
     foreach (DataRow dr in dt.Rows) 
     { 
      WriteLog("RequestForEachCustomer - Before Task"); 
      Task objTask = new Task(delegate { RequestProcessing(dr); }); 
      objTask.Start(); 
      WriteLog("RequestForEachCustomer - After Task"); 
     } 
    } 
    catch (Exception ex) 
    { 
     // Logging in DB + Text File 
    } 
} 

public static void RequestProcessing(object dr) 
{ 
    try 
    { 
     WriteLog("Inside RequestProcessing"); 
     // .... some work .... 
    } 
    catch (Exception ex) 
    { 
     // Logging in DB + Text File 
    } 
} 

Nun, was auf dem Produktionsserver passiert, ist, dass es der letzte Eintrag in RequestForEachCustomer protokolliert die „RequestForEachCustomer - Nach Aufgabe“ ist aber es funktioniert nicht Logge den Eintrag von RequestProcessing ein, was bedeutet, dass die Aufgabe überhaupt nicht startet. Es gibt keine Ausnahmen in Datenbank oder Textdatei.

In der Ereignisanzeige des Fensters sind keine Ereignisse protokolliert. Auch der Dienst funktioniert weiter (wenn ich einen anderen Datensatz in die Datenbank einfüge, wird er sofort vom Dienst verarbeitet, so dass der Dienst auch nicht feststeckt. Er scheint RequestProcessing Aufgabe nicht zu verarbeiten.)

Ich bin davon verwirrt und es wäre großartig, wenn jemand auf den Fehler hinweisen könnte, den ich mache. Ach, übrigens habe ich vergessen zu erwähnen, dass dieser Dienst vor ein paar Tagen perfekt auf dem Server funktionierte und auf meinem lokalen PC immer noch gut funktioniert.

EDIT:

WriteLog:

public static void WriteErrorLog(string Message) 
{ 
      StreamWriter sw = null; 
      try 
      { 
       lock (locker) 
       {  
        sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\LogFile.txt", true); 
        sw.WriteLine(DateTime.Now.ToString() + ": " + Message); 
        sw.Flush(); 
        sw.Close(); 
       } 
      } 
      catch (Exception excep) 
      { 
       try 
       { 
        // .... Inserting ErrorLog in DB .... 
       } 
       catch 
       { 
        throw excep; 
       } 
       throw excep; 
      } 
     } 

Ich habe auch ein Eintrag auf OnStop() so etwas wie "Service Stopped" und seine Protokolle jedes Mal protokolliert ich meinen Dienst zu beenden, um das Problem nicht in existieren könnte WriteLog Funktion.

+2

Es würde vorschlagen (von der Snippets), dass dt.Rows leer ist - daher kein Protokoll. – BugFinder

+0

Was ist 'WriteLog()'? Vielleicht ist es nicht threadsicher. – Sinatr

+0

Nein. Ich kann dir versichern, dass dt.Rows nicht leer ist. – NewbieProgrammer

Antwort

0

Ich empfehle Ihnen, Ihren Code wie in diesem MSDN-Beispiel zu refaktorieren. Was mich in Ihrem Code stört, ist, dass Sie niemals auf Aufgaben warten müssen, die irgendwo enden.

Im folgenden Beispiel werden 10 Aufgaben gestartet, von denen jedem ein Index als Statusobjekt übergeben wird. Aufgaben mit einem Index von zwei bis fünf werfen Ausnahmen. Der Aufruf der WaitAll-Methode umschließt alle Ausnahmen in einem AggregateException-Objekt und übergibt sie an den aufrufenden Thread.

Source : Task.WaitAll Method (Task[])

Diese Zeile aus Beispiel von einiger Bedeutung sein könnte:

Task.WaitAll(tasks.ToArray()); 
Verwandte Themen