异步操作(WCF 数据服务)
与内部网络中运行的应用程序相比,Web 应用程序必须适应客户端与服务器之间更长时间的延迟。 若要优化应用程序的性能和用户体验,建议您在通过 Web 访问 WCF 数据服务 服务器时使用 DataServiceContext 和 DataServiceQuery<TElement> 类的异步方法。
尽管 WCF 数据服务 服务器异步处理 HTTP 请求,但是 WCF 数据服务 客户端库的某些方法是同步的,并且会一直等到整个请求-响应交换完成后才会继续执行。 WCF 数据服务 客户端库的异步方法不会等待此交换完成,并且允许应用程序同时保持具有响应能力的用户界面。
通过使用 DataServiceContext 和 DataServiceQuery<TElement> 类上的一对方法(分别以 Begin 和 End 开头),可以执行异步操作。 Begin 方法注册一个委托,服务将在操作完成时调用该委托。 应在注册的委托中调用 End 方法以处理来自已完成操作的回调。 在调用 End 方法以完成异步操作时,必须从用于开始该操作的那个 DataServiceQuery<TElement> 或 DataServiceContext 实例进行调用。 每个 Begin 方法采用一个 state 参数,该参数可将一个状态对象传递给回调。 此状态对象是从 IAsyncResult 中检索的,后者随回调提供,用于调用对应的 End 方法以完成异步操作。 例如,如果在对 DataServiceQuery<TElement> 实例调用 BeginExecute 方法时提供该实例作为 state 参数,那么 IAsyncResult 将返回同一个 DataServiceQuery<TElement> 实例。 随后将使用 DataServiceQuery<TElement> 的这个实例调用 EndExecute 方法以完成查询操作。 有关更多信息,请参见如何:执行异步数据服务查询(WCF 数据服务)。
备注
.NET Framework for Silverlight 中提供的客户端库仅支持异步操作。有关更多信息,请参见 WCF 数据服务 (Silverlight)(可能为英文网页)。
.NET Framework 客户端库支持下列异步操作:
操作 |
方法 |
---|---|
从 DataServiceContext 执行查询。 |
|
从 DataServiceContext 执行批查询。 |
|
将相关实体加载到 DataServiceContext 中。 |
|
保存对 DataServiceContext 中对象的更改 |
异步操作的线程注意事项
在多线程应用程序中,不一定会在用于调用 Begin 方法的那个线程(即创建初始请求的线程)中调用针对异步操作注册为回调的委托。 对于必须在特定线程中调用回调的应用程序,必须将处理响应的 End 方法的执行显式封送至所需线程。 例如,在基于 Windows Presentation Foundation (WPF) 的应用程序和基于 Silverlight 的应用程序中,必须通过对 Dispatcher 对象使用 BeginInvoke 方法,将响应封送回 UI 线程。 有关更多信息,请参见Querying the Data Service (WCF Data Services/Silverlight)。