0

Ich habe im Wesentlichen das gleiche Problem hier diskutiert: http://khason.net/blog/dependency-property-getters-and-setters-in-multithreaded-environment/Wie erhält man eine Silverlight-Abhängigkeitseigenschaft, wenn sie nicht im UI-Thread ist?

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); 
} 

Wenn die Zeile „< < < < <“ gekennzeichnet von einem Hintergrund-Thread aufgerufen wird, wirft Silverlight eine InvalidOperationException und meine App wird wahrscheinlich Deadlock.

Leider funktioniert die Lösung aus dem Blogpost nicht, da die Silverlight-Version der Dispatcher-Klasse die synchronisierten Invoke-Methoden ausblendet - nur BeginInvoke wird als öffentlich markiert.

Antwort

5

Speichern Sie im Hauptthread den Wert SynchronizationContext.Current in einer Variablen namens context, die für den erzeugten Thread verfügbar ist, bevor Sie den Hintergrundthread generieren. Dann versuchen Sie den folgenden Code,

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

Sie könnten die statische Methode zu prüfen, Umschreiben zu überprüfen, um zu sehen, ob es in dem richtigen Thread ist, und wenn nicht, verwenden Sie einen gebunkert SynchronizationContext.Current Wert auf den richtigen Thread zu wechseln vorübergehend um den Wert abzurufen.

+0

Arbeitete perfekt, danke. –

0

Sie können BeginInvoke in Verbindung mit einem manuellen Reset-Ereignis verwenden, das beim Rückruf ausgelöst wird.

Verwandte Themen