首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为多线程请求重用或创建新的IOrganizationService

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

Stack Overflow用户
提问于 2015-11-28 13:02:20
回答 2查看 1.1K关注 0票数 3

有时,我会将大量数据推入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()方法中进行多线程处理。

EN

回答 2

Stack Overflow用户

发布于 2015-11-29 05:12:16

如果您的应用程序的多线程实际上会提高性能,我会感到有点惊讶(但是如果您可以发布相反的数据,我希望看到它)。

问题1:

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

问题2:

我不知道微软会用一种或另一种方式来说明,所以这会让我相信,不管答案是什么,你都不能指望它。接口没有定义答案,因此在下一次更新时它可能会被更改。话虽如此,我只想亲自测试一下:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-12-07 13:57:51

因此,总而言之,在CRM中从工作流中运行多个线程是很好的。这样做:

  1. 使用传递给Execute()方法的executionContext参数。
  2. 创建这样一个IOrganizationService:

IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

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

我遇到的其他问题与具体的CRM插件有关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33971600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档