Я создал образец рабочего процесса числовой догадки, используя эту статью , дюймы 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;
}
}