为多线程请求重用或创建新的IOrganizationService

时间:2015-11-28 13:02:21

标签: c# multithreading performance dynamics-crm-2011 crm

我有时会将大量数据推送到CRM中,例如批量更新。它是在工作流(CodeActivity)类中使用其Execute()方法完成的。我可以使用传递给该方法的参数(上下文)来获取ServiceFactory,然后创建IOrganizationService。

然后我迭代一个对象列表来更新,更改属性,并调用service.Update(myObj)。到目前为止一切都很好。

现在,为了加快速度,我想我会运行2-4个并行执行更新的线程。

问题1 如果我运行两个或更多线程,我应该重用我刚刚创建的服务,还是创建一个新服务?即为每个线程创建一个服务,或共享它?

我基本上在做Parallel.Invoke(action1, action2, action3);,其中每个操作都需要一个服务实例来调用service.Update(myObj);

问题2 如果调用serviceFactory.CreateOrganizationService(context.UserId),它是否会实际创建新服务,还是返回现有服务?

我已经确定了其他所有内容,并且工作正常,但希望在工作流程Execute()方法中获得多线程推荐/最佳实践。

2 个答案:

答案 0 :(得分:1)

如果您的应用程序多线程实际上会提高性能,我会感到有点惊讶(但是如果您可以发布其他情况的数据,我很乐意看到它)

问题1:

客户端使用的CrmOrganizationService不是线程安全的,我怀疑实现IOrganizationService的服务器版本也是线程安全的。

问题2:

我不知道微软指定了这种或那种方式,所以这会让我相信无论答案是什么,你都不能指望它。界面没有定义答案,因此可能会在下次更新时更改。话虽如此,我会亲自测试一下:

if(Object.ReferenceEquals(serviceFactory.CreateOrganizationService(context.UserId), serviceFactory.CreateOrganizationService(context.UserId)){
    throw new Exception("Returns the same IOrganizationService");
}

throw new Exception("Returns a new IOrganizationService");

答案 1 :(得分:1)

因此,总而言之,从工作流程中在CRM中运行多个线程就可以了。这样做:

  1. 使用传递给Execute()方法的executionContext参数。
  2. 像这样创建一个IOrganizationService:
  3. IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

    现在将该服务用于一个线程/任务。如果运行多个线程,请为每个线程创建一个服务。

    我遇到的其他问题与特定的CRM插件有关。