2009-11-09 4 views
0

Voici les 2 façons dont nous utilisons en essayant d'utiliser thread/dispatcher pour plusieurs tâches: Je me demande si quelqu'un a des suggestions qui est une meilleure option.WPF Threading question meilleure option

Snippet 1:

Thread t = new Thread(new ThreadStart(delegate 
       { 
        MyMethod(); 
       })); 
t.IsBackground = true; 
t.Start(); 
t.Join(); 

Snippet 2:

Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, 
      (dummyDelegate)delegate 
      { 
       MyMethod(); 

      } 
    ); 

S'il vous plaît conseiller. Remerciements N

+0

Peut-être que l'affiche originale signifiait utiliser this.Dispatcher.Invoke dans l'extrait 2 pour exécuter le code sur le thread d'interface utilisateur à laquelle cet objet appartient? L'utilisation de Dispatcher.CurrentDispatcher exécute simplement le code de manière synchrone sur le même thread. – Anton

Répondre

0

ya un problème avec l'aide d'un bon ole BackgroundWorker?

Ce n'est pas WinForms spécifique afin que vous puissiez l'utiliser dans WPF.

2

Aucun des deux n'est "meilleur": ils sont différents.

Le premier exemple exécute MyMethod sur un thread d'arrière-plan. Donc, si MyMethod bloque, par exemple sur l'activité réseau ou en faisant un calcul intensif, cela ne bloque pas le thread d'interface utilisateur, et l'interface utilisateur reste réactive. (Cependant, puisque votre exemple de code bloque et attend, vous perdez actuellement cet avantage de toute façon.) L'inconvénient est que MyMethod doit sauter à travers des cerceaux mineurs s'il veut lire ou mettre à jour l'interface utilisateur.

Le deuxième exemple exécute MyMethod sur le thread d'interface utilisateur. Cela permet à MyMethod d'interagir sans restriction avec les éléments de l'interface utilisateur, mais ne convient pas si MyMethod prend beaucoup de temps car il gèle l'interface utilisateur pendant que MyMethod est en cours d'exécution.

Cela dépend donc de ce que fait MyMethod. Si MyMethod met à jour deux éléments de l'interface utilisateur, puis quitte, utilisez la deuxième option. Si MyMethod charge des fichiers ou télécharge des données et/ou exécute des calculs longs, utilisez le premier.

1

Il existe également une troisième option: utilisez le Threadpool pour exécuter un appel asynchrone de courte durée. Par exemple:

System.Threading.Threadpool.QueueUserWorkItem(
    delegate(object context) 
    { 
     // context is unused 
     MyMethod(); 
    }); 

Cela utilisera un thread du pool de threads pour exécuter MyMethod. Lorsque la méthode est terminée, le thread sera renvoyé au pool. L'avantage de cette méthode est que vous n'avez pas à gérer vous-même la durée de vie des threads, et que vous n'encourez pas la mémoire et les performances de création et de destruction du thread.