有时,我会将大量数据推入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()方法中进行多线程处理。
发布于 2015-11-29 05:12:16
如果您的应用程序的多线程实际上会提高性能,我会感到有点惊讶(但是如果您可以发布相反的数据,我希望看到它)。
问题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");发布于 2015-12-07 13:57:51
因此,总而言之,在CRM中从工作流中运行多个线程是很好的。这样做:
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
现在,将该服务用于一个线程/任务。如果运行多个线程,则每个线程创建一个服务。
我遇到的其他问题与具体的CRM插件有关。
https://stackoverflow.com/questions/33971600
复制相似问题