2

ListBoxWebサービスへの非同期呼び出しが正常に戻ったら、GUIでを更新する必要があります。Webサービス呼び出しの結果をにダンプするほど簡単ではありません。これはObservableCollection、結果が実際にインデックスに登録されDictionary、常に上位1000件の結果のみがに表示されるListBoxためです。

上位1000件の結果を選択するコードがあり、表示を更新するListBoxには、結果が正常に返されたときにそれを呼び出す方法を見つける必要があります。

this.client.GetAsync<RepositoryResponse>(string.Format
    ("/repository?Dto={0}", reader.Dto.ToJson()),
    r => ReadSuccessCallback(r),
    (r, x) => ReadErrorCallback(r, x));

このコードは、GUIの更新が行われたウィンドウとは異なるダイアログボックスで実行されます。1つのダイアログボックスを閉じているときにこの非同期getを呼び出し、元のウィンドウでを更新したいと考えてListBoxいます。Actionメソッドで実行するオブジェクトを渡そうとしReadSuccessCallbackましたが、正しく実行されますが、Items背後にあるコレクションListBoxが別のスレッドに属しているため、変更できないというエラーが表示されます。

が正常に戻っListBoxた後でのみ、1000アイテムの新しいチャンクを取得する(およびの表示を更新する)にはどうすればよいですか?GUIが実行されているのと同じスレッドでが実行されるGetAsyncことを確認する方法はありますか?ReadSuccessCallback

4

2 に答える 2

1

これは一種の古い学校ですが、うまくいくはずです。問題の操作をバックグラウンドワーカーのDoWorkイベントに配置し、表示したクライアント呼び出しを同期呼び出しに変更します。これは、現在は独自のスレッドにあるため、結果のデータをRunWorkerCompletedイベントに渡し、必要なものを処理します。その時点でのGUIスレッドのリストボックス。

于 2012-11-15T22:13:03.930 に答える
1

UI コントロールを更新する場合は、UI スレッドでコールバックを呼び出す必要があります。これは、 WPF Dispatcherを使用してこれを行うさまざまな方法を示す良い記事です。

したがって、方法の1つは次のようなことです。

this.client.GetAsync<RepositoryResponse>(string.Format
("/repository?Dto={0}", reader.Dto.ToJson()),
r => {
    myListBox.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal, () => {
           //populate results int myListBox
        }); 
},
(r, x) => ReadErrorCallback(r, x));
于 2012-11-15T23:40:13.113 に答える