2

ListBox一旦对 Web 服务的异步调用成功返回,我需要在我的 GUI 中刷新 a 。这并不像将 Web 服务调用的结果转储到 an 中那么简单,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 更新的窗口不同的对话框中执行。我在关闭一个对话框时将此称为异步获取,并希望ListBox在原始窗口中刷新。我尝试Action在方法中传递一个要执行的对象ReadSuccessCallback,它正确执行,但给我一个错误,说Items背后的集合ListBox属于不同的线程,并且无法更改。

ListBox只有在GetAsync成功返回后,我才能获得 1000 个项目的新块(并刷新 的显示)?有什么方法可以确保ReadSuccessCallback在我的 GUI 运行的同一线程中执行?

4

2 回答 2

1

这是一种老派,但它应该工作。将有问题的操作放入后台工作人员DoWork 事件中,您显示的客户端调用更改为同步调用,因为它现在在自己的线程中,将结果数据传递给 RunWorkerCompleted 事件,然后处理所需的此时列表框对于 GUI 线程是安全的。

于 2012-11-15T22:13:03.930 回答
1

如果你想更新 UI 控件,你应该在 UI 线程上调用回调。这是一篇很好的文章,展示了使用WPF Dispatcher执行此操作的不同方法。

因此,其中一种方法是执行以下操作:

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 回答