我有时会将大量数据推送到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()
方法中获得多线程推荐/最佳实践。
答案 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中运行多个线程就可以了。这样做:
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
现在将该服务用于一个线程/任务。如果运行多个线程,请为每个线程创建一个服务。
我遇到的其他问题与特定的CRM插件有关。