在自定义工作流活动中使用PLINQ / TPL

时间:2012-09-26 05:30:26

标签: dynamics-crm dynamics-crm-2011

我定义了一个工作流,以便在更改自定义实体上的字段时执行。 工作流调用自定义活动,然后使用PLINQ处理一堆记录。 自定义激活调用的代码如下所示:

protected override void Execute(CodeActivityContext executionContext)
{
  // Get the context service.
  IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
  IOrganizationServiceFactory serviceFactory =     
  executionContext.GetExtension<IOrganizationServiceFactory>();
 // Use the context service to create an instance of IOrganizationService.
 IOrganizationService _orgService = serviceFactory.CreateOrganizationService  
 (context.InitiatingUserId);
     int pagesize = 2000;
     // use FetchXML aggregate functions to get total count of the number of record to process
     // Reference: http://msdn.microsoft.com/en-us/library/gg309565.aspx
     int totalcount = GetTotalCount();

   int totalPages = (int)Math.Ceiling((double)totalcount / (double)pagesize);           
    try
     {
         Parallel.For(1, 
                     totalPages + 1, 
                    () => new MyOrgserviceContext(_orgService), 
            (pageIndex, state, ctx) =>
             {

                var items = ctx.myEntitySet.Skip((pageIndex - 1) * pagesize).Take(pagesize);
                 foreach(var item in items)
                {
                    //process item as needed 
                   ctx.SaveChanges();
                }
                 return ctx;
             },
             ctx => ctx.Dispose()
             );
     }
     catch (AggregateException ex)
     {
        //handle as needed
     }
 }

我注意到以下错误是一个聚合异常(在InnerExceptions中多次出现相同的错误):

“当不应处理CrmDbConnection时遇到它”

从我读过的内容:  CRM 2011 Workflow "Invalid Pointer" error

当您拥有类级变量时可能会发生这种情况,因为工作流运行时可能会结束  跨多个工作流调用共享同一个类实例。这显然不是这里的情况,而且我没有在多个记录上运行此工作流的多个实例。这个工作流程只有一个实例在任何时间点运行。

上面的代码在工作流主机(CRMAsyncService)之外提取和托管时工作正常。

这是使用CRM 2011 Rollup 10。

非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

我不确定,但这可能只是因为您在ctx.Dispose()处理了您的连接。

由于每个new MyOrgservicecontext(_orgService)对象使用相同的IOrganizationService,我会怀疑第一个MyOrgservicecontext何时处置,然后所有其他MyOrgservicecontext个对象都有一个已处理的连接 - 意味着他们的服务调用将失败并抛出异常。

我建议删除处理以查看是否可以解决问题。