2010-01-06 3 views
4

Je ne connais pas très bien le C# jusqu'à maintenant, du moins pas assez pour être sûr de pouvoir faire quelque chose quand c'est la première fois.Sélecteur C# pour l'interrogation cyclique de base de données

Quelle pourrait être la meilleure façon d'organiser l'interrogation basée sur le minuteur de base de données SQL Server à partir de mon application WPF pour la mise à jour des contrôles?

Pourriez-vous partager quelques réflexions sur cette question ou, peut-être, des exemples de code comment cela pourrait-il être implémenté? Dans quelle mesure est-il possible (ou raisonnable) de faire une période de sondage? Qu'est-ce qui peut être dangereux à faire?

Peut-être qu'il existe une façon standard et correcte de le faire?

Répondre

2

Si vous avez besoin d'une mise à jour à l'échelle de l'application et que la mise à jour n'est pas trop longue, la meilleure option est de démarrer un arrière-plan Thread qui peut exécuter et publier des événements pour les abonnés. actualisé (éventuellement vérifier d'abord s'il a été modifié en utilisant une logique spécifique en ajoutant un EventArgs personnalisé à l'événement).

Par exemple, créer une instance de cette part de la classe de haut niveau (peut-être votre principal code de formulaire?):

using System; 
using System.Threading; 
using System.Windows.Forms; 

public class PollerThread 
{ 
    private Thread _thread; 
    private SynchronizationContext _syncContext; 

    public event EventHandler UpdateFinished; 

    public PollerThread() 
    { 
     _syncContext = WindowsFormsSynchronizationContext.Current; 

     ThreadStart threadStart = new ThreadStart(ThreadStartMethod); 
     _thread = new Thread(threadStart); 
     _thread.Name = "UpdateThread"; 
     _thread.IsBackground = true; 
     _thread.Priority = System.Threading.ThreadPriority.Normal; 
    } 

    public void Start() 
    { 
     if ((_thread.ThreadState & ThreadState.Unstarted) == ThreadState.Unstarted) 
      _thread.Start(); 
     else 
      throw new Exception("Thread has already been started and may have completed already."); 
    } 

    public void ThreadStartMethod() 
    { 
     try 
     { 
      while (true) 
      { 
       // Go get the new data from the SQL server 

       OnUpdateFinished(); // Notify all subscribers (on their own threads) 
       Thread.Sleep(10000); // 10 sec wait before the next update 
      } 
     } 
     catch (ThreadAbortException) 
     { 
      // The thread was aborted... ignore this exception if it's safe to do so 
     } 
    } 

    protected virtual void OnUpdateFinished() 
    { 
     if (UpdateFinished != null) 
     { 
      SendOrPostCallback method = new SendOrPostCallback(
      delegate(object state) 
      { 
       UpdateFinished(this, EventArgs.Empty); 
      }); 
      _syncContext.Send(method, null); 
     } 
    } 
} 

Abonnez chacun des domaines qui doivent répondre à de nouvelles mises à jour de l'événement UpdateFinished. Cela s'exécutera sur le thread utilisé pour construire la classe PollerThread.

Cette réponse peut sembler un peu lâche, et s'applique plus spécifiquement aux projets de formulaires Windows, mais l'utilité dépend vraiment de votre implémentation actuelle. Au moins, vous pouvez construire sur cela de toute façon. J'espère que ça aide :)

+0

Il m'est apparu la nuit dernière que j'ai oublié de mentionner quelque chose ici. N'oubliez pas de * désattribuer * l'écouteur d'événement pour les formulaires quand ils sont fermés par exemple: 'myPollerThread.UpdateFinished - = nouveau EventHandler (myPollerThread_UpdateFinished);' les formulaires fermés recevront toujours des événements et provoqueront probablement des exceptions sur le formulaire être disposé. – Codesleuth

4

Vous pouvez utiliser un objet SqlDependency, bien que cela lie votre implémentation très étroitement avec SQL Server 2005+.

1

Vos exigences sont très généralement décrits, je ne peux répondre que dans les généralisations:

En général:

  1. Combien de demandes seront vote en même temps?
  2. Quelle est la taille du jeu de résultats?

Dix clients ne sont pas beaucoup, dix mille est. Dix lignes sont petites, un millier de lignes devient grand et lent. Répondre à ces questions vous aidera à déterminer comment définir la fréquence d'interrogation. Vous devrez équilibrer d'autres considérations telles que la réactivité de l'interface utilisateur (faire la mise à jour asynchrone des données), le besoin de nouvelles données et la connaissance de la fréquence de mise à jour de la base de données pour déterminer la conception la plus efficace.

Questions connexes