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 :)
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