0

私は基本的に同じ問題がここで議論してきた:http://khason.net/blog/dependency-property-getters-and-setters-in-multithreaded-environment/UIスレッドにないときにSilverlight依存関係プロパティを取得する方法はありますか?

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

ラインは「< < < < <は、」バックグラウンドスレッドから呼び出されるマークされた場合は、Silverlightは、InvalidOperationExceptionがをスローし、私のアプリは、おそらくデッドロックします。

残念ながら、SilverlightバージョンのDispatcherクラスが同期されたInvokeメソッドを隠しているため、ブログ投稿のソリューションは機能しません。BeginInvokeはpublicとマークされています。

答えて

5

メインスレッドでは、バックグラウンドスレッドを生成する前に、SynchronizationContext.Currentの値を、生成されたスレッドにアクセス可能なcontextという変数に保存します。その後

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

あなたはそれが正しいスレッドであるかどうかを確認するには、静的メソッドを書き換えることを検討する必要があります、次のコードを試してみてください、とされていない場合、一時的に正しいスレッドに切り替えることを隠しSynchronizationContext.Current値を使用します値を取得します。

+0

ありがとうございました。 –

0

BeginInvokeをコールバックでトリガーする手動リセットイベントと併用することができます。

関連する問題