1

遅延が終了したときにワークフローを自動的に再開しようとしています(遅延アクティビティを使用)。これは、WorkflowServiceHostを使用している場合は自動的に実行されますが、WorkflowApplicationを使用しています。

これを処理するインターネット上のコードがいくつかあります 。これらの目標を達成するためにWorkflowApplicationを使用しているサンプルを次に示します。

  • ユーザーがタスクを作成し、このタスクはワークフローに従います
  • ユーザーは、再ホストされたデザイナーを使用して独自のワークフローを設計し、彼のワークフロー定義はデータベースに保存されます。
  • 各ワークフロー定義では、ユーザーがワークフローを変更できるようにデータベースに異なるバージョンを保存できます。コードは、タスクでアクションが実行され、ブックマークを再開する必要がある場合に正しいバージョンを使用します。
  • タスクはワークフローを使用して開始できるため、タスクテーブルには、このタスクに使用されるワークフロー定義とバージョンを格納します。

私が今抱えている問題は、遅延アクティビティを使用する場合です。上記のリンクを使用して、実行可能なインスタンスが検出された場合、WorkflowApplicationを作成し、LoadRunnableInstanceメソッドを使用してワークフローをロードする必要があります。

if (hasRunnableWorkflows)
{

    Console.WriteLine("Found runnable workflows");
    WorkflowApplication app = new WorkflowApplication(...);
    app.InstanceStore = store;
    app.LoadRunnableInstance();
}

問題は次のとおりです。

  • LoadRunnableInstanceを呼び出すには、WorkflowApplicationを作成する必要があるため、WorkflowApplicationCTorにルートアクティビティを与える必要があります。
  • ルートアクティビティを作成するには、データベースからロードする必要のあるワークフロー(およびバージョン)を知る必要があります
  • ロードするワークフローを知るには、タスクIDが必要です
  • タスクIDを知るには、ワークフローIDを知る必要があります。ワークフローIDは、LoadRunnableInstanceを呼び出した後にのみ使用できます。

だから...私はこのループを壊す必要があります:)

ワークフローをロードする前にワークフローIDを取得する方法を誰かが知っていますか?

4

2 に答える 2

0

Microsoft wcf および wf サンプルの ControllingWorkflowApplications サンプルは、インスタンス ストアからロードするワークフローを知るために、システムがワークフロー ID のリストを維持する必要があることを示しています。その例では、バージョンを処理できるはずのワークフロー xaml ファイルのパスも保持しています。この例は従うのが最も簡単ではありませんが、PeristenceIOParticipant から継承する WorkflowAppication への拡張が WorkflowApplication に追加されます。このクラスは、ワークフローとともに保存される追加データを抽出して定義します。あなたの目的のために、それはIDになります。

instance.Extensions.Add(() => new WorkflowDefinitionExtension(originalPath, connectionString)); //PeristenceIOParticipant から継承

于 2012-10-20T14:00:09.140 に答える
0

これは私にとってはうまくいきました。

Delay アクティビティがワークフロー ランタイムによってヒットされると、PersistableIdle イベントが発生し、 PersistableIdleAction.Persistが返さ れると、Delay アクティビティが自動的に再開されます。イベント ハンドラーがPersistableIdleAction.Unloadを返す場合、Delay アクティビティは自動的に再開されません。サンプルはこちら

ワークフロー定義:

Variable<string> name = new Variable<string>
{
    Name = "name"
};

wf = new Sequence
{
    Variables =
    {
      name
    },
    Activities =
    {
         new WriteLine()
         {
             Text = "Workflow Triggered"
         },    
         new Delay()
         {
             Duration = TimeSpan.FromSeconds(10)
         },
         new WriteLine()
         {
             Text = "Activity1 Completed"
         },
     }
 };

ワークフローアプリケーション:

   WorkflowApplication wfApp = new WorkflowApplication(wf);
   wfApp.PersistableIdle = delegate (WorkflowApplicationIdleEventArgs e)
   {
         return PersistableIdleAction.Persist;
   };
   // Start the workflow.
   wfApp.Run();
于 2016-05-22T19:05:45.140 に答える