代码之家  ›  专栏  ›  技术社区  ›  MIantosca

从多个BackgroundWorker调用时锁定OData DataServiceContext

  •  1
  • MIantosca  · 技术社区  · 14 年前

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

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

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

    lock (dataService)
    {
        results = query.EndExecute(queryCallback).ToList<Video>(); 
    }
    

    它修复了问题,现在可以可靠地处理数据请求。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Pablo Castro    14 年前

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

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