【问题标题】:Silverlight 4 MultithreadSilverlight 4 多线程
【发布时间】:2010-05-13 20:59:04
【问题描述】:

我正在尝试使用新数据大约每 1/2 秒更新一次 Silverlight 4 UI。我已经使用 net.tcp 绑定和从服务器发出回调连接到 WCF 服务。为了确保尽快从服务中获取数据,我在 Silverlight 应用程序内的后台工作人员上启动了代理。

我的问题是,如何从回调中获取结果并更新绑定到数据网格的 ObservableCollection?我尝试了许多不同的方法,并且不断收到可怕的跨线程错误。

【问题讨论】:

    标签: wcf silverlight multithreading silverlight-4.0 observablecollection


    【解决方案1】:

    使用DispatcherBeginInvoke。例如:-

     private void MyCallback(object sender, SomeArgsClass e)
     {
         // perhaps some extraction of a payload or something
         Deployment.Current.Dispatcher.BeginInvoke( () =>
         {
            // Code you need to run on the UI thread.
         });
    
         // Note code may or may not exit here before code above has completed.
         // So be careful with disposable types etc.
     }
    

    【讨论】:

      【解决方案2】:

      您可以采取多种方法:

      • 在后台线程中使用Deployment.Current.Dispatcher,并对其进行Deployment.Current.Dispatcher.CheckAccess()调用

      • 从启动后台线程的 UI 组件传递调度程序,并使用该句柄执行 CheckAccess() 调用

      • 这是我的首选选项:将委托(回调)传递给后台线程,当它有新数据时调用该委托,并且该委托位于 UI 控件中 - 然后它可以使用可用的 Dispatcher用户界面控件

      这类事情的模式是:

      private void DoMyUIUpdate(List<object> updates)
      {
          if (Deployment.Current.Dispatcher.CheckAccess())
          {
              //do my work, update the UI
          }
          else
              Deployment.Current.Dispatcher.BeginInvoke(new Action<List<object>>(DoMyUIUpdate), updates);
      }
      

      【讨论】:

      • 如果我使用选项 3(首选),我将失去在工作线程上启动代理所获得的所有性能增强,因为回调将被发送到 UI 线程。看看这个:tomasz.janczuk.org/2010/03/…
      • 不,你不需要 - 任何类型的 UI 更新都必须在 UI 线程上完成,在 Dispatcher 上调用任何东西意味着它会被编组到 UI 线程。 //do my work 可以像更新 UI 绑定的集合一样简单。您所说的“性能增强”是以不阻塞 UI 线程的方式检索数据 - 更新 UI 不是从后台线程完成,无论您何时使用哪种方法与 Dispatcher 打交道。
      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多