Windows постоянство рабочего потока iscomplete не устанавливается в 1, всегда 0 - PullRequest
0 голосов
/ 18 февраля 2020

Я создал образец рабочего процесса числовой догадки, используя эту статью , дюймы net 4.6.1 и включенное постоянство.

Когда образец запущен, я вижу работу Экземпляр потока создается в приведенной ниже таблице

 [System.Activities.DurableInstancing].[InstancesTable] 

После того, как рабочий процесс выполнен (число угадано правильно), если я go в базу данных и наблюдаю за таблицей, он по-прежнему отображается как

ExecutionStatus : Executing & IsCompleted : 0 ожидание того, что эти значения будут завершены и 1

Пример запускается в консольном приложении, а код Program.cs приведен ниже, пожалуйста, помогите мне настроить его правильно, чтобы соответствующим образом обновить состояние

class Program
    {
        static InstanceStore instanceStore ;
        static void Main(string[] args)
        {

            SetupInstanceStore();
            var inputs = new Dictionary<string, object>() { { "MaxNumber", 100 } };
            AutoResetEvent syncEvent = new AutoResetEvent(false);
            AutoResetEvent idleEvent = new AutoResetEvent(false);            
            WorkflowApplication wfApp = new WorkflowApplication(new StateMachineNumberGuessWorkflow(), inputs);                   
            wfApp.InstanceStore = instanceStore;


            wfApp.PersistableIdle = delegate (WorkflowApplicationIdleEventArgs e)
            {
                return PersistableIdleAction.Persist;
            };
            wfApp.Completed = delegate (WorkflowApplicationCompletedEventArgs e)
            {
                int Turns = Convert.ToInt32(e.Outputs["Turns"]);
                Console.WriteLine(wfApp.Id);
                Console.WriteLine(e.CompletionState);
                Console.WriteLine("Congratulations, you guessed the number in {0} turns.", Turns);
                Console.ReadKey();
                syncEvent.Set();
            };

            wfApp.Aborted = delegate (WorkflowApplicationAbortedEventArgs e)
            {
                Console.WriteLine(e.Reason);
                syncEvent.Set();
            };

            wfApp.OnUnhandledException = delegate (WorkflowApplicationUnhandledExceptionEventArgs e)
            {
                Console.WriteLine(e.UnhandledException.ToString());
                return UnhandledExceptionAction.Terminate;
            };

            wfApp.Idle = delegate (WorkflowApplicationIdleEventArgs e)
            {
                idleEvent.Set();
            };

            wfApp.Run();

            //syncEvent.WaitOne();
            // Loop until the workflow completes.
            WaitHandle[] handles = new WaitHandle[] { syncEvent, idleEvent };
            while (WaitHandle.WaitAny(handles) != 0)
            {
                //Console.WriteLine("in while loop");
                // Gather the user input and resume the bookmark.
                bool validEntry = false;
                while (!validEntry)
                {
                    int Guess;
                    if (!Int32.TryParse(Console.ReadLine(), out Guess))
                    {
                        Console.WriteLine("Please enter an integer ---");
                    }
                    else
                    {
                        validEntry = true;
                        wfApp.ResumeBookmark("EnterGuess", Guess);
                    }
                }
            }
        }
        private static void SetupInstanceStore()
        {
            instanceStore =
               new SqlWorkflowInstanceStore(@"Data Source=localhost;Initial Catalog=WorkFlowInstanceDB;Integrated Security=True;Asynchronous Processing=True");

            InstanceHandle handle = instanceStore.CreateInstanceHandle();

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

            instanceStore.DefaultInstanceOwner = view.InstanceOwner;


        }
    }

1 Ответ

0 голосов
/ 24 февраля 2020

после отладки в течение некоторого времени я обнаружил, что консольное приложение завершается до того, как рабочий процесс продолжается, если я прекращаю выход из консоли, она сохраняется и из-за поведения библиотеки sqlserver persistance удаляет запись экземпляра при успешном завершении выполнения .

...