Silverlight 从多个BackgroundWorker调用时锁定OData DataServiceContext

Silverlight 从多个BackgroundWorker调用时锁定OData DataServiceContext,silverlight,backgroundworker,odata,Silverlight,Backgroundworker,Odata,我有一个连接到OData服务的Silverlight 4应用程序。我的模型并行地向服务提交多个查询,在查询回调中,我使用backgroundworker处理结果 如果我只进行一次调用,这种方法非常有效,但当我并行调用多个调用时(有时有效),但大多数情况下,当我调用EndExecute时,在dataservice上下文中会出现异常(似乎是在向其内部更改跟踪机制添加实体时) 所以我决定在我称之为EndExecute的点锁定数据服务 lock (dataService) { results =

我有一个连接到OData服务的Silverlight 4应用程序。我的模型并行地向服务提交多个查询,在查询回调中,我使用backgroundworker处理结果

如果我只进行一次调用,这种方法非常有效,但当我并行调用多个调用时(有时有效),但大多数情况下,当我调用EndExecute时,在dataservice上下文中会出现异常(似乎是在向其内部更改跟踪机制添加实体时)

所以我决定在我称之为EndExecute的点锁定数据服务

lock (dataService)
{
    results = query.EndExecute(queryCallback).ToList<Video>(); 
}
lock(数据服务)
{
结果=query.EndExecute(queryCallback.ToList();
}
它解决了问题,现在可以可靠地处理数据请求


我的问题有两个——这是推荐的做法吗?OData上下文不是线程安全的吗?

DataServiceContext不是线程安全的。它没有任何线程关联,但不支持多个线程同时调用它


因此,是的,您必须通过使用锁或其他方式确保一次只有一个线程进入上下文和关联对象(例如查询对象)。

您是否使用OData服务的单个“查询”实例,或者每个线程化请求都有自己的服务实例吗?我使用的是odata服务的一个实例-我考虑过为每个查询创建一个实例,但不确定是否建议这样做。我可以创建odata服务的多个实例作为锁定单个实例的替代方案吗?赞成/反对?