ユーザー定義エンティティのフィールドが変更されたときに実行するワークフローを定義しています。ワークフローは、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 ワークフローの「無効なポインター」エラー
これは、クラス レベルの変数がある場合に発生する可能性があります。これは、ワークフロー ランタイムが複数のワークフロー呼び出しで同じクラス インスタンスを共有する可能性があるためです。これは明らかにここでは当てはまりません。また、複数のレコードで実行されているこのワークフローの複数のインスタンスもありません。任意の時点で実行されているこのワークフローのインスタンスは 1 つだけです。
上記のコードは、ワークフロー ホスト (CRMAsyncService) の外部で抽出およびホストされている場合に正常に機能します。
これは CRM 2011 Rollup 10 を使用しています。
どんな洞察も大歓迎です。