【问题标题】:Reuse or create new IOrganizationService for multithreaded requests为多线程请求重用或创建新的 IOrganizationService
【发布时间】:2015-11-28 13:02:20
【问题描述】:

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

然后我迭代一个对象列表以更新、更改属性并调用service.Update(myObj)。到目前为止一切顺利。

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

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

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

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

我已经确定了其他所有内容,它工作得很好,但想要在工作流的 Execute() 方法中获得多线程时的推荐/最佳实践。

【问题讨论】:

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


    【解决方案1】:

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

    问题 1:

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

    问题 2:

    我不知道 Microsoft 指定了一种或另一种方式,所以这会让我相信无论答案是什么,你都不能指望它。该界面没有定义答案,因此它可能会随着下一次更新而改变。话虽如此,我只是自己测试一下:

    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");
    

    【讨论】:

    • 我同意我怀疑这是否会给您带来实质上更快的交易 - 但它会使您的编码和可维护性复杂化。由于这是在工作流程中(并且在 2011 年始终是异步的),这看起来就像建造一架飞机来穿越城镇。
    • 很好的比喻@Nicknow!
    • 我不需要 IOrganizationService 是线程安全的,我想为每个线程创建一个实例。下面是一个示例:blogs.msdn.com/b/crminthefield/archive/2012/09/07/… - 我还没有设法从我的工作流程中检索现有凭据。
    • 问题 1 谈到使用原始服务。我认为这意味着将它重用于您的线程。
    • 好点,我意识到我稍微改变了策略。为了让事情保持美观、干净和安全,我为每个线程创建了一项服务。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2016-12-04
      • 2015-07-29
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多