2009-03-28 6 views
3

J'ai créé une application qui doit effectuer périodiquement certaines tâches en utilisant des threads. Je ne suis pas sûr que ce soit la meilleure façon de le faire, donc j'apprécierais vraiment que quelqu'un puisse suggérer un meilleur moyen.Quelle est la meilleure façon d'exécuter un processus continu dans son propre thread?

Ceci est la façon dont je l'ai fait:

Ceci est la classe qui comprend les fonctions pour un processus continu (recherche de sessions inactives et le nettoyage des éléments inactifs):

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); 
     } 
    } 
} 

C'est la principale formulaire où le thread est initialisé:

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(); 
    } 

Merci!

Répondre

2

Le plus gros problème que je peux voir est ... pourquoi sortirait-il jamais? Vous faites un Join, donc évidemment s'attendre à ce qu'il se termine, mais est seulement . J'aurais un champ (volatile) bool quelque part (sur le SessionCleaner) qui obtient défini/et utilisé dans le while - par exemple:

volatile bool keepRunning = true; 

ou similaire (mis à false avant d'appeler Join pour quitter).

Je ne vois pas non plus beaucoup de raison de garder la référence à sessionCleanerThread (juste l'initialiser et la démarrer en une seule méthode), et l'exception de la déglutition est probablement une mauvaise idée.

0

La méthode terminateSessionCleanerThread() ne retournera jamais, apparemment, comme indiqué par Marc. À moins qu'il y ait quelque chose que nous ne pouvons pas voir.

Il existe un related question concernant l'utilisation de nouveaux Thread() par rapport à ThreadPool.QueueUserWorkItem(). À mon avis, je pense que cette application veut utiliser QUWI. Aucune raison de ne pas le faire. new Thread() créera un thread de premier plan. Cela n'a pas d'importance si le thread se termine, mais ce n'est pas nécessaire pour cette application.

Le nettoyage doit-il être exécuté toutes les 5 secondes? On dirait que cela aurait du sens sur un serveur, sous forte charge. Mais dans ce cas, une application WinForms semble être le mauvais outil pour le travail. Doit être un service Windows qui enregistre les messages dans le journal des événements, etc.

Questions connexes