【IT168专稿】在Silverlight 3 RIA服务编程中异步域操作可谓家常便饭。因此,全面地理解异步域操作相关知识是基于RIA服务技术开发Silverlight应用的必修课。在本文中,我们将以精简的形式剖析RIA服务编程中异步域操作中涉及的要点并归纳应注意的问题。
1.RIA服务异步域操作
DomainContext支持3种类型域操作:Query,Submit和Invoke。这些操作中的的每一种都有一个相应的操作类型用于描述正在进行中的异步操作。例如,当一个查询加载到一个DomainContext中,异步的Load调用将立即返回一个LoadOperation实例。请参考如下代码:
var query = from e in _ctxt.GetEmployeesQuery()
where e.ManagerID == 1
select e;
LoadOperation<Employee> lo = _ctxt.Load(query);
上面的操作结果既提供了有关于正在进行的操作的动态的可绑定的状态信息,也提供了可取消当前操作的支持。同样地,一个提交请求将返回一个SubmitOperation,而服务操作调用将返回一个InvokeOperation。
接下来,我们将详细地讨论这些操作及其基类有关知识。
2.基类OperationBase
这个类是所有.NET RIA服务异步操作的基类。这个类实现了接口INotifyPropertyChanged,因此,它的操作状态成员可以是数据绑定型的,而且当操作的完成状态改变时,将会引发通知。
基类OperationBase提供了如下成员:
•IsComplete—一旦操作完成便返回true。注意,当一项操作成功结束,或者是完成但仍带有错误,或者是此操作被取消,都被认为是操作完成。
•Completed事件—当一项操作完成时引发此事件。
•UserState—与操作相关的用户状态。
•Cancel()/CanCancel/IsCanceled—如果操作能够被取消并且没有完成,那么CanCancel将返回true。在取消操作前,将会检查CanCancel的值。如果操作已经完成,则将抛出一个异常。
•Error/HasError—如果操作已经完成,但发生了错误,那么HasError的值将为true,而且Error中将包含相应的异常信息。
下面你将会看到,一个域操作中还可以指定一个操作完成对应的回调函数。如果指定了一个回调函数,那么,此回调函数在任何情况下也会被调用,无论此操作是成功结束,还是完成但仍带有错误,还是此操作被取消。
另外值得注意的是,这个回调函数在Completed事件引发以前也会被调用。
3.LoadOperation操作
DomainContext.Load<T>将返回一个LoadOperation<T>的实例。LoadOperation描述了一个正在操作中的异步加载操作。另外,此操作还提供了下面额外的状态及功能支持:
•Entities—一个已加载的实体的强类型枚举类型。一旦调用返回,集合即变为空。注意,此集合实现了接口INotifyCollectionChanged,当操作完成时自新将得到更新。
•AllEntities—由查询操作加载的所有实体的集合,而且还包括任何相关联的实体。注意,此对象也实现了接口INotifyCollectionChanged。一旦调用返回,集合即变为空。注意,此对象也实现了接口INotifyCollectionChanged,当操作完成时自新将得到更新。
•TotalEntityCount—返回查询中对应的所有服务器端实体总数。
•EntityQuery—用于初始化加载操作。
•MergeOption—加载操作中指定的MergeOption。