0

独自の WCF サービスを作成し、Silverlight クライアント経由で正常に通信できました。ただし、非同期コールバックで興味深い問題に遭遇しました。コールバックが呼び出されると、恐ろしい無効なクロス スレッド アクセスで UI コントロールを更新できません

私のコールバック関数は次のようになります

    private void GetTimeCallBack( object sender, Talk.ClientBase<IService>.ClientEventArgs e )
    {
        lblDisplay.Text = e.Object.ToString();
    }

簡単なグーグル検索で、代わりにこれをしなければならないことがわかりました。

private void GetTimeCallBack( object sender, Talk.ClientBase<IService>.ClientEventArgs e )
    {
        Dispatcher.BeginInvoke( () => lblDisplay.Text = e.Object.ToString() );
    }

これですべて正常に動作しますが、コールバックが別のスレッドで実行されるとは思っていませんでした。クラス内で何かを変更するには、常に Dispatcher クラスを使用する必要がありますか? それとも、これは UI 要素に限定されていますか? 私は Dispatcher クラスにまったく慣れていないので、もっと理解したいと思っています。

4

1 に答える 1

1

はい..詳細については、リンクをチェックしてください。以下の質問に対するジョエルの回答を追加しました

Silverlight 2 Beta 2 では、非同期通信に使用される同時実行モデルが大幅に変更されました。Beta 1 では、これらのタイプのリクエストは UI スレッドで返されました。Beta 2 では、WebRequest の BeginGetResponse を使用することを選択すると、Silverlight にスレッド プールからのワーカー スレッドを使用するように指示することになります。その結果、UI スレッドでユーザー インターフェイス要素を更新することはできません。Dispatcher.BeginInvoke を使用すると、このスレッドプール スレッドから UIThread でメソッドを起動することができます。Async コールバックからの UI 要素との対話は、クロス スレッド例外をスローします。

于 2010-03-26T06:06:38.283 に答える