2009-06-03 6 views
5

Salut Je développe une application .Net et je veux obtenir les résultats suivants:Appeler une fenêtre forment un autre thread (.Net)

J'ai une application WinForms, et une minuterie (System.Timers.Timer) qui exécute un thread basé sur un planning. Le problème est que je ne peux pas accéder à l'interface utilisateur (formulaire windows) à partir du thread secondaire (WorkerThread), l'erreur indique quelque chose comme le composant ne peut pas être accessible à partir d'un thread qui ne l'a pas créé.

Y a-t-il un moyen d'y parvenir?

Merci!

Répondre

10
formObject.Invoke(delegate { 
     // action to perform on UI thread 
}); 
+2

Et notez que ce travail est essentiellement ajouté à une file d'attente de travail pour le thread d'interface utilisateur qui finira par l'exécuter lorsqu'il a le temps. –

2

Disons que votre méthode de travail (que vous exécutez dans un thread) est

DoWork(args) 
{ 
    ... 
    UpdateUI(); 
} 

La méthode qui gère l'événement Elapsed de minuterie doit faire:

OnTimerElapsed(object sender, ElapsedEventArgs e) 
{ 
    args = GetArgs(); 
    this.BeginInvoke(() => DoWork(args)); 
    // 'this' refers to form here. 
    // You can also use BeginInvoke on a user control for updating it. 
} 

Cela se déroulera DoWork dans un thread séparé et DoWork aura la possibilité de mettre à jour l'interface utilisateur.

Questions connexes