【问题标题】:Callback to update GUI after asynchronous ServiceStack web service call异步 ServiceStack Web 服务调用后回调以更新 GUI
【发布时间】:2012-11-15 21:44:25
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf delegates callback servicestack


    【解决方案1】:

    这是一种老派,但应该可以。将相关操作放入background worker DoWork 事件中,将您显示的客户端调用更改为同步调用,因为它现在在自己的线程中,将结果数据传递给 RunWorkerCompleted 事件然后为 GUI 线程安全地处理列表框所需的内容。

    【讨论】:

    【解决方案2】:

    如果您想更新 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2011-09-03
      • 2016-09-14
      • 1970-01-01
      • 2014-04-25
      相关资源
      最近更新 更多