Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf Silverlight 4多线程_Wcf_Silverlight_Multithreading_Silverlight 4.0_Observablecollection - Fatal编程技术网

Wcf Silverlight 4多线程

Wcf Silverlight 4多线程,wcf,silverlight,multithreading,silverlight-4.0,observablecollection,Wcf,Silverlight,Multithreading,Silverlight 4.0,Observablecollection,我正在尝试用新数据大约每1/2秒更新我的Silverlight 4 UI。我已经使用net.tcp绑定并从服务器发出回调连接到了一个WCF服务。为了确保尽快从服务中获取数据,我已经在Silverlight应用程序的后台工作程序上启动了代理 我的问题是,如何从回调中获得结果并更新绑定到datagird的ObservableCollection?我已经尝试了许多不同的方法,并不断得到可怕的跨线程错误。使用调度程序开始调用。例如:- private void MyCallback(object se

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


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

使用
调度程序
开始调用
。例如:-

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

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

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

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

  • 这是我的首选选项:将委托(回调)传递给后台线程,当它有新数据时调用该委托,并且该委托位于UI控件中-然后它可以使用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);
}
private void域更新(列表更新)
{
if(Deployment.Current.Dispatcher.CheckAccess())
{
//做我的工作,更新用户界面
}
其他的
Deployment.Current.Dispatcher.BeginInvoke(新操作(DoMyUIUpdate),更新);
}

如果我使用选项3(首选),我将失去在工作线程上启动代理所获得的所有性能增强,因为回调将发送到UI线程。检查一下:不,你没有-任何类型的UI更新都必须在UI线程上完成,调用Dispatcher上的任何东西都意味着它被编组到UI线程上。//do my work可以像更新UI绑定到的集合一样简单。您提到的“性能增强”是以一种不阻塞UI线程的方式检索数据——无论您在处理Dispatcher时使用哪种方法,更新UI都不是从后台线程完成的。