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 ワークフローの「無効なポインター」エラー

これは、クラス レベルの変数がある場合に発生する可能性があります。これは、ワークフロー ランタイムが複数のワークフロー呼び出しで同じクラス インスタンスを共有する可能性があるためです。これは明らかにここでは当てはまりません。また、複数のレコードで実行されているこのワークフローの複数のインスタンスもありません。任意の時点で実行されているこのワークフローのインスタンスは 1 つだけです。

上記のコードは、ワークフロー ホスト (CRMAsyncService) の外部で抽出およびホストされている場合に正常に機能します。

これは CRM 2011 Rollup 10 を使用しています。

どんな洞察も大歓迎です。

4

1 に答える 1

0

確かではありませんが、これは、で接続を破棄しているためかもしれませんctx.Dispose()

new MyOrgservicecontext(_orgService)オブジェクトは同じIOrganizationServiceを使用するため、最初のオブジェクトMyOrgservicecontextが破棄され、次に他のすべてのMyOrgservicecontextオブジェクトが破棄された接続を持っていると思われます。つまり、サービス呼び出しは失敗し、例外がスローされます。

これで問題が解決するかどうかを確認するために、disposeを削除することをお勧めします。

于 2012-09-26T19:50:59.493 に答える