0

こんにちは、Windows ワークフローは初めてです。これは非常に簡単かもしれませんが、私は長い間これにこだわっています。ステート マシン ワークフローがあり、その中にワークフロー ホスト クラスがあります。このコードでは持続性が機能していません。デバッグ中、ポインターは application.persistableIdle イベントには決して行きません。

Serializable として設定したカスタム入力引数を使用します。

以下は、ホストクラスの私のコードです:

 static InstanceStore instanceStore;
    static AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
    static Activity activity = new Activity1();
    static Guid id = new Guid();
    static int intContractHeaderKey;
   static  Contract contract = new Contract();

 public ContractActivityHost(Guid wfid, Int32 contractHeaderID)
    {
        SetupInstanceStore();

        StartAndUnloadInstance(contractHeaderID);
        if (intContractHeaderKey > 0)
        {
            LoadAndCompleteInstance(id, intContractHeaderKey);
        }
    }

    static void StartAndUnloadInstance(Int32 contractHeaderID)
    {

        contract = new Contract();
        //var objContract = new object();

         var input = new Dictionary<string, object>
                            {
                                {"TheContract", contract}                                
                            };
         input.Add("ContractHeaderKey", contractHeaderID);


         WorkflowApplication application = new WorkflowApplication(activity, input);


        application.InstanceStore = instanceStore;


        //returning IdleAction.Unload instructs the WorkflowApplication to persists application state and remove it from memory  
        application.PersistableIdle = (e) =>
        {
            return PersistableIdleAction.Unload;
        };

        application.Unloaded = (e) =>
        {
            instanceUnloaded.Set();
        };

        //application.Idle = (e) =>
        //    {
        //        //application.Unload();
        //        instanceUnloaded.Set();

        //    };


        //This call is not required 
        //Calling persist here captures the application durably before it has been started
        application.Persist();
        id = application.Id;

        application.Run();

        instanceUnloaded.WaitOne();

        //application.Unload();
        //contract = (Contract)objContract;

        intContractHeaderKey = contract.ContractID;
    }

    static void LoadAndCompleteInstance(Guid wfid, Int32 contractHeaderID)
    {
        //string input = Console.ReadLine();
        while (!contract.ContractWFPause)
        {
            contract.FireContract(contract.ContractID);

            WorkflowApplication application = new WorkflowApplication(activity);
            application.InstanceStore = instanceStore;

            application.Completed = (workflowApplicationCompletedEventArgs) =>
            {
                //Console.WriteLine("\nWorkflowApplication has Completed in the {0} state.", workflowApplicationCompletedEventArgs.CompletionState);
                strWFStatus = "Completed";
            };

            application.Unloaded = (workflowApplicationEventArgs) =>
            {
                //Console.WriteLine("WorkflowApplication has Unloaded\n");
                strWFStatus = "Unloaded";
                instanceUnloaded.Set();
            };

            application.Load(wfid);


            instanceUnloaded.WaitOne();
        }
    }

    private static void SetupInstanceStore()
    {
        instanceStore =
            new SqlWorkflowInstanceStore(@"Data Source=.;Initial Catalog=WorkflowInstanceStore;Integrated Security=True;");

        InstanceHandle handle = instanceStore.CreateInstanceHandle();
        InstanceView view = instanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(10));
        handle.Free();

        instanceStore.DefaultInstanceOwner = view.InstanceOwner;
    }

私は長い間これを解決しようとしてきましたが、どこが欠けているのかわかりません。いくつかのサンプル アプリケーションを実行し、フローとロジックに合わせてコードを変更しましたが、それでも機能しません。application.persist の後に、[System.Activities.DurableInstancing].[InstancesTable] ビューにレコードが挿入されます。ただし、デバッグ ポインターは instanceUnloaded.WaitOne(); を超えて移動しません。実際にはアイドル状態になります。application.idle イベントのコメントを外すと、そのイベント コードに入ります。

これを解決するための助けは素晴らしいでしょう。

ありがとう。

4

1 に答える 1

-1

以下の詳細を追加したかどうかを確認してください

instanceStore = new SqlWorkflowInstanceStore(ConfigurationManager.ConnectionStrings["WFPersistenceDb"].ConnectionString);

StateMachineStateTracker.Promote(this.instanceStore);
于 2014-05-07T10:16:26.263 に答える