Wcf Silverlight 4多线程
我正在尝试用新数据大约每1/2秒更新我的Silverlight 4 UI。我已经使用net.tcp绑定并从服务器发出回调连接到了一个WCF服务。为了确保尽快从服务中获取数据,我已经在Silverlight应用程序的后台工作程序上启动了代理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
我的问题是,如何从回调中获得结果并更新绑定到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都不是从后台线程完成的。