0

我定义了一个工作流,以在更改自定义实体上的字段时执行。工作流调用一个自定义活动,该活动反过来使用 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 工作流程“无效指针”错误

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

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

这是使用 CRM 2011 汇总 10。

任何见解都非常感谢。

4

1 回答 1

0

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

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

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

于 2012-09-26T19:50:59.493 回答