2011-06-27 1 views
0

J'ai un problème avec mon application .net actuelle: lorsque la ligne d'une base de données est mise à jour ou qu'une nouvelle ligne est insérée, mon service .net doit lire ces modifications et soumettre une commande d'impression .Suggestion de lecture de threads et de base de données

Je l'avais mis en œuvre les fonctions suivantes:

public void OnStart() 
{ 
    ThreadMgmt pthread = new ThreadMgmt(); 
    pthread.printNotification += new pthread.DatabaseChanged(); 
    pthread.frequency = 2000; 

    ThreadStart ts = new ThreadStart(pthread.Wait); 
    Thread t = new Thread(ts); 

    t.Start(); 
} 

void ReadDataBase() {...} 

void Printing(){...} 

public class ThreadMgmt 
{ 
    public delegate void UpdateDelegate(); 

    public event UpdateDelegate Notify; 

    private int frequency {set;get;} 


    public void Wait() 
    { 
     for (int i = 0; i <= Freq; i++) 
     { 
      Thread.Sleep(this.frequncy); 
      Notify(); 
     } 
    } 
} 

Mais je besoin d'aide sur les concepts sur le filetage et les événements en boucle, je voudrais savoir si quelqu'un doit faire face au même problème et comment le résoudre ...

Merci

+0

Je ne vois pas de problème? Qu'est-ce qui ne fonctionne pas? Ou est-ce juste un problème de performance? –

+0

Je veux dire à l'application que si la condition while est satisfaite ne s'arrêtent pas pour travailler et continuer à chercher des changements de base de données –

Répondre

1

Voici une solution simple.

 private bool m_stop; 
    public void Stop() 
    { 
     lock (this) 
      m_stop = true; 
    } 

    public void Wait() 
    { 
     for (int i = 0; i <= Freq; i++) 
     { 
      lock (this) 
      { 
       if (m_stop) 
       return; 
      } 
      Thread.Sleep(this.frequncy); 
      if (Notify != null) 
       Notify(); 
     } 
    } 

Si vous voulez arrêter de se produire plus rapidement, vous pouvez utiliser Monitor.Wait et Monitor.PulseAll, mais vous devriez lire sur ces avant de vous décider de le faire.

+0

ce qui se passe est Freq> i, la fonction Wait() va quitter droite? Alors, comment dire à l'application que les données de la base de données continuellement en commun et si une propriété par exemple a une valeur de 0 alors doWork! –

+0

@Angel, consultez ma nouvelle réponse. –

Questions connexes