0

Silverlight で Lync Silverlight アプリケーションを開発してきましたが、現在はそれを WPF に移行しようとしています。

ただし、いくつかのスレッド アフィニティの問題に直面しています。たとえば、Lync クライアントの状態をページのテキストブロックに表示するため、コード ビハインドで状態変更イベント ハンドラーを配線し、Lync クライアントの状態が変化するたびに新しい状態をテキストブロックに書き込みます。

現在、これは Silverlight では完全に機能していましたが、WPF では許可されていないようです。今私の質問は次のとおりです。

  1. Silverlight は WPF のサブセットであるはずなのに、WPF ではなく Silverlight で動作するのはなぜですか?

  2. スレッド アフィニティは重要な概念であり、インボーク ディスパッチャーを使用できることはわかっていますが、イベント ハンドラーとコールバックの形で非同期プログラミングの概念を打ち負かすだけではありませんか?

  3. XAML ページで定義されたボタンがあり、そこで定義されたクリック イベント ハンドラーは他の UI 要素にアクセスできます。上記の問題は発生しません。

    しかし、コード ビハインドで LyncClient インスタンスを定義すると、それに定義されたイベント ハンドラーは UI 要素にアクセスできません。UIElements と Silverlight の他のオブジェクトとの間にそのような違いが見つからなかったのはなぜですか?

4

1 に答える 1

0

上記のコメントに基づいて、次の「答え」を提案します...

SL API の記述方法と WPF API の記述方法には何らかの違いがある可能性が高いと思います。これは、API がコールバックを発行するときに使用されるスレッドの違いを説明している可能性があります。これを確認するには、次のことができます。

  1. MSに直接聞く
  2. スレッド ID をログに記録し、それをアプリケーションのメイン スレッドと比較するために、コールバック メソッドにいくつかの診断コードを挿入します。SL と WPF の両方でこれを実行して、それらが同じスレッドか異なるスレッドかを確認します。
  3. Reflector でアセンブリを開いて、各 API がどのように記述されたかを調べます。

この特定の状況を処理するという点では、コールバックで次のことができます。

  1. ディスパッチャー オブジェクト (SL と WPF では異なります) を取得し、Dispatcher.Invoke を介して常に UI の更新を発行します。
  2. databinding と INotifyPropertyChanged を使用して、プロパティから UI を分離します。ViewModel またはコード ビハインドでプロパティを宣言できます。次に、UI のテキスト ボックスをそのプロパティにバインドします。データバインディングには、プロパティの変更を正しいスレッドに自動的にマーシャリングするいくつかのスマートが含まれています (ほとんどの場合)。

それが役立つことを願っています。

于 2011-07-08T19:55:06.820 に答える