我正在尝试使用新数据大约每1/2秒更新一次Silverlight 4 UI。我使用net.tcp绑定并从服务器发出回调来连接到WCF服务。为了确保我尽快从服务中获取数据,我已经在我的Silverlight应用程序内部的后台工作者上启动了我的代理。
我的问题是,如何从回调中获取结果并更新绑定到datagird的ObservableCollection?我已经尝试了许多不同的方法,并继续得到可怕的跨线程错误。
答案 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);
}