Répartiteur.CurrentDispatcher.BeginInvoke N'Est Pas En Invoquant
J'ai un FileSystemWatcher
et les événements déclenchés par cette quand un a regardé les modifications de fichiers sont posées sur un thread différent du thread d'INTERFACE utilisateur. Afin d'éviter et de cross-thread accès volation de plaisir, j'essaie d'utiliser
public void RaisePathChanged(object sender, RenamedEventArgs e)
{
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
{
//Some code to handle the file state change here.
}));
}
Cette compile bien et la RaisePathChanged
est tiré comme il se doit. Toutefois, le code à l'intérieur du délégué Action(() => { /*Here*/})
n'est jamais appelé/invoquée, le code est simplement ignorée.
Pourquoi le code ignorés, comment puis-je résoudre ce problème et est-ce la meilleure façon de s'assurer de code est exécuté sur le thread qui a créé en WPF?
Merci pour votre temps.
OriginalL'auteur MoonKnight | 2013-11-22
Vous devez vous connecter pour publier un commentaire.
Vous mélangez les choses.
Dispatcher.CurrentDispatcher
n'est pas le même queApplication.Current.Dispatcher
.La deuxième est celle qui vous semblent être à la recherche pour.
Jetez un oeil à ce.
Répartiteur.CurrentDispatcher vs Demande.Actuel.Répartiteur
Essayer avec l'application répartiteur.
OriginalL'auteur dev hedgehog
Dispatcher.CurrentDispatcher
est le répartiteur de la "en cours" thread - dans ce cas, le threadRaisePathChanged
est en cours d'exécution sur.Quand vous dites
Dispatcher.CurrentDispatcher
.NET va créer un nouveau répartiteur si il n'y en avait aucun.Il ne sera cependant pas
Run()
dit répartiteur!Alors lorsque vous planifiez quelque chose sur elle (avec
BeginInvoke
) il ne sera pas exécutée, à moins que le répartiteur est en cours d'exécution.Susceptibles de répondre à votre première question (Pourquoi n'est-il pas Invoquer?)
Pour éviter de fausser le filetage de violation d'accès, vous devez le répartiteur de le thread qui a créé tout ce que vous essayez de protéger et assurez-vous qu'il est un répartiteur.
Si ce que vous essayez de protéger a été créé sur le GUI par défaut fil, puis utiliser
Application.Current.Dispatcher
comme la réponse précédente dit, sinon, vous aurez besoin de faire un peu plus d'explications et de post un peu plus de code avant que nous puissions répondre à votre deuxième question. http://www.diranieh.com/NET_WPF/Threading.htm a une assez courte intro sur le sujet.OriginalL'auteur ILIA BROUDNO