2009-09-24 5 views
3

Nous avons une application silverlight qui utilise un répartiteur et j'apprécierais toute aide expliquant ce que font les codes suivants? (Malheureusement, le développeur qui a écrit le code est parti).Comment dispatcher fonctionne-t-il un thread?

donc ce que nous avons est la suivante:

public class ABC 
{ 
    private Dispatcher dispatcher; 
    private Thread threadRunner; 

    public void ABC() 
    { 
     threadRunner= new Thread(ThreadRunnerMethod) 
         { 
          IsBackground = true, 
          ApartmentState = ApartmentState.STA 
         }; 
     threadRunner.Start(); 
    } 

    private static void ThreadRunnerMethod() 
    { 
     Dispatcher.Run(); 
    } 


    public void MainMethod() 
    { 
     dispatcher = Dispatcher.FromThread(threadRunner); 
     dispatcher.Invoke(new Action(() => 
            // "DO SOME WORK WITH A COM OBJECT" 
            )); 

    } 
} 

j'ai une certaine expérience de base avec filetage, mais je ne sais pas comment tout cela fonctionne?

JD

Répondre

3

Il est l'équivalent de Control.Invoke dans Windows Forms, essentiellement - il vient d'être séparé dans son propre objet. Si je comprends bien, Dispatcher.Run va démarrer une boucle d'événement, et vous pouvez appeler les appels dans cette boucle d'événement en utilisant Dispatcher.Invoke. Dispatcher.FromThread trouve l'objet Dispatcher qui est responsable d'un thread donné - dans ce cas, il trouve la boucle d'événement en cours d'exécution dans le nouveau thread. Par conséquent, dans votre code, le délégué créé avec l'expression lambda s'exécutera dans le thread nouvellement créé.

+0

Bonjour Jon, Merci pour la réponse. Pour Control.invoke() si j'ai raison, nous mettons en attente les tâches que le thread principal doit faire. Ici, les tâches sont effectuées dans le nouveau thread? En outre, si une autre tâche est lancée, l'ajouterait-elle simplement à la file d'attente du nouveau thread et ne bloquerait pas le thread appelant? Merci –

+0

Dans les deux cas, nous mettons en attente des tâches pour "un thread qui exécute une boucle d'événements" à faire. Pour WinForms, c'est le thread de l'interface utilisateur - qui ne doit pas nécessairement être celui sur lequel votre application a démarré, nécessairement. Si vous appelez Invoke, * * bloquera le thread appelant; BeginInvoke ne fait pas. –

+0

Merci beaucoup. Il est maintenant clair ce qui se passe. J'ai commandé votre livre hier, j'ai hâte de le lire. JD. –

Questions connexes