2009-03-28 6 views
3

Ich habe eine Anwendung erstellt, die regelmäßig einige Aufgaben mit Threads ausführen muss. Ich bin mir nicht sicher, ob dies der beste Weg ist, dies zu tun, also würde ich es wirklich schätzen, wenn jemand einen besseren Weg vorschlagen könnte.Was ist der beste Weg, um einen kontinuierlichen Prozess in einem eigenen Thread auszuführen?

Dies ist die Art, wie ich es tat:

Dies ist die Klasse, die die Funktionen für ein kontinuierliches Verfahren beinhaltet (für inaktive Sitzungen suchen und Ruhe Elemente Reinigung):

public class SessionCleaner 
{ 
    private SQLWorks sqlWorks; 
    public SessionCleaner() 
    { 
     sqlWorks = new SQLWorks(); 
    } 

    private void cleanIdleSessions() 
    { 
     //this function deletes sessions from database 
     sqlWorks.CleanIdleSessions(10); 
    } 



    //this is an endless loop for executing the cleaning every 5 seconds 
    public void DoCleanIdleSessions() 
    { 
     while(true) 
     { 
      cleanIdleSessions(); 
      Thread.Sleep(5000); 
     } 
    } 
} 

Dies ist der Haupt Formular wo der Thread initialisiert wird:

public partial class FormMain : Form 
{ 

... 
public FormMain() 
    { 
     InitializeComponent(); 
... 
     startSessionCleaner(); 
... 
    } 

private void startSessionCleaner() 
    { 
     initializeSessionCleanerThread(); 
     sessionCleanerThread.Start(); 
    } 

private void initializeSessionCleanerThread() 
    { 
     sessionCleaner = new SessionCleaner(); 
     sessionCleanerThread = new Thread(new ThreadStart(sessionCleaner.DoCleanIdleSessions)); 
    } 

private void terminateSessionCleanerThread() 
    { 
     try 
     { 
      sessionCleanerThread.Join(1000); 
     } 
     catch(Exception ex) 
     { 
      string sDummy = ex.ToString(); 
     } 
    } 

private void FormMain_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     terminateSessionCleanerThread(); 
    } 

Danke!

Antwort

2

Das größte Problem, das ich sehen kann, ist ... warum würde es jemals verlassen? Sie tun ein Join, so offensichtlich erwarten, dass es zu beenden, aber es ist nur while(true). Ich würde eine (volatile) Bool Feld irgendwo (auf den SessionCleaner), die und in den while verwendet wird gesetzt/gelöscht - zum Beispiel:

volatile bool keepRunning = true; 

oder ähnlich (setzen Sie sich auf false vor Join zu beenden Aufruf).

Ich sehe auch nicht viel Sinn darin, den Verweis auf sessionCleanerThread (nur initialisieren und starten Sie es in einer Methode), und die Ausnahme Schlucken ist wahrscheinlich eine schlechte Idee.

0

Die Methode "terminateSessionCleanerThread()" wird anscheinend nie zurückgegeben, wie von Marc bemerkt. Es sei denn, es gibt etwas, was wir nicht sehen können.

Es gibt eine related question in Bezug auf die Verwendung neuer Thread() im Vergleich zu ThreadPool.QueueUserWorkItem(). Ich denke, diese Anwendung möchte QUWI verwenden. Kein Grund, dies nicht zu tun. new Thread() erstellt einen Vordergrund-Thread. Das ist egal, wenn der Thread beendet wird, aber für diese App ist es nicht notwendig.

Muss die Reinigung wirklich alle 5 Sekunden ausgeführt werden? Scheint, dass das auf einem Server unter hoher Last sinnvoll wäre. Aber in diesem Fall scheint eine WinForms App das falsche Werkzeug für den Job zu sein. Sollte ein Windows-Dienst sein, der Nachrichten in das Ereignisprotokoll schreibt usw.

Verwandte Themen