0

J'ai essentiellement le même problème discuté ici: http://khason.net/blog/dependency-property-getters-and-setters-in-multithreaded-environment/Comment obtenir une propriété de dépendance silverlight lorsqu'elle n'est pas dans le thread de l'interface utilisateur?

public static readonly DependencyProperty MyPropertyProperty = 
     DependencyProperty.RegisterAttached("MyProperty", typeof(bool), 
     typeof(MyObject), new PropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged))); 

public static bool GetMyProperty(DependencyObject obj) 
{ 
    return (bool)obj.GetValue(MyPropertyProperty);  <<<<< 
} 

public static void SetMyProperty(DependencyObject obj, bool value) 
{ 
    obj.SetValue(MyPropertyProperty, value); 
} 

Si la ligne marquée « < < < < < » est appelé à partir d'un fil de fond, Silverlight lève une InvalidOperationException et mon application va probablement une impasse.

Malheureusement, la solution du blog ne fonctionnera pas car la version Silverlight de la classe Dispatcher masque les méthodes Invoke synchronisées - seul BeginInvoke est marqué public.

Répondre

5

Dans le thread principal, avant de générer le thread d'arrière-plan, enregistrez la valeur SynchronizationContext.Current dans une variable appelée context accessible au thread engendré. Ensuite, essayez le code suivant,

bool result = false; 
context.Send((c) => result = YourClass.GetMyProperty(obj), null); 

Vous pouvez envisager de réécrire la méthode statique pour vérifier si elle est dans le fil droit, et sinon, utilisez une valeur SynchronizationContext.Current planqué pour passer au fil correct temporairement pour récupérer la valeur.

+0

A travaillé parfaitement, merci. –

0

Vous pouvez utiliser BeginInvoke en conjonction avec un événement de réinitialisation manuelle qui se déclenche sur le rappel.

Questions connexes