我定义了一个工作流,以便在更改自定义实体上的字段时执行。 工作流调用自定义活动,然后使用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。
非常感谢任何见解。
答案 0 :(得分:0)
我不确定,但这可能只是因为您在ctx.Dispose()
处理了您的连接。
由于每个new MyOrgservicecontext(_orgService)
对象使用相同的IOrganizationService
,我会怀疑第一个MyOrgservicecontext
何时处置,然后所有其他MyOrgservicecontext
个对象都有一个已处理的连接 - 意味着他们的服务调用将失败并抛出异常。
我建议删除处理以查看是否可以解决问题。