Silverlight 4多线程

时间:2010-05-13 20:59:04

标签: wcf silverlight multithreading silverlight-4.0 observablecollection

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

我的问题是,如何从回调中获取结果并更新绑定到datagird的ObservableCollection?我已经尝试了许多不同的方法,并继续得到可怕的跨线程错误。

2 个答案:

答案 0 :(得分:3)

使用Dispatcher BeginInvoke。例如: -

 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.
 }

答案 1 :(得分:2)

您可以采取以下几种方法:

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

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

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

这类事情的模式是:

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);
}