Silverlight 中调用服务全部采用异步方式,在调用 WCF 时似乎没有什么问题。
但是如果要用一个 WebRequest 对象去向某个页面 Post 一些内容,然后获得回应。
就会发现在 Worker thread 中将无法更新 UI.
在 Windows Forms 里,可以用 Control.Invoke. 但是 Silverlight 没有这个。
Silverlight 中有更好的办法。DependencyObject 类有一个属性 Dispatcher,可以通过它来更新相关 UI 对象。
比如可以这样写:
(假设是在上传一个文件后更新文件列表)
注意这个 BeginInvoke 方法很先进. 他可以接受任何的 delegate,还能传递任意数目的参数过去。
这里传了一个简单的 newFileId.
补充:
如果需要同时更新多个控件,则可以通过他们共同的祖先控件的 Dispatcher 来调用。
但是如果要用一个 WebRequest 对象去向某个页面 Post 一些内容,然后获得回应。
就会发现在 Worker thread 中将无法更新 UI.
在 Windows Forms 里,可以用 Control.Invoke. 但是 Silverlight 没有这个。
Silverlight 中有更好的办法。DependencyObject 类有一个属性 Dispatcher,可以通过它来更新相关 UI 对象。
比如可以这样写:
(假设是在上传一个文件后更新文件列表)
private
void
UpdateFileList(
int
newFileId)
{
//
}
private delegate void UpdateFileListDelegate( int newFileId);
// Worker thread
void ResponseReady(IAsyncResult asyncResult)
{
//![](/Images/dot.gif)
// 更新文件列表
listFiles.Dispatcher.BeginInvoke(
new UpdateFileListDelegate(UpdateListFile), newFileId
);
}
{
//
![](/Images/dot.gif)
}
private delegate void UpdateFileListDelegate( int newFileId);
// Worker thread
void ResponseReady(IAsyncResult asyncResult)
{
//
![](/Images/dot.gif)
// 更新文件列表
listFiles.Dispatcher.BeginInvoke(
new UpdateFileListDelegate(UpdateListFile), newFileId
);
}
注意这个 BeginInvoke 方法很先进. 他可以接受任何的 delegate,还能传递任意数目的参数过去。
这里传了一个简单的 newFileId.
补充:
如果需要同时更新多个控件,则可以通过他们共同的祖先控件的 Dispatcher 来调用。