0

如果我在我的program.cs中有以下'工作流生命周期事件'。工作流(WF)生命周期事件

无法理解WaitOne()会等待哪个信号到达?

Completed是否具有最高优先级或idle具有最高优先级或任何信号到达,它会收到?

app.Run(); 
syncEvent.WaitOne(); 



app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) 
{ 
    return PersistableIdleAction.Unload; 
}; 

app.Unloaded = delegate(WorkflowApplicationEventArgs e) 
{ 
    Console.WriteLine("Workflow {0} Unloaded.", e.InstanceId); 
    syncEvent.Set(); 
}; 


app.Completed = delegate(WorkflowApplicationCompletedEventArgs e) 
{ 
    if (e.CompletionState == ActivityInstanceState.Faulted) 
    { 
     Console.WriteLine("Workflow {0} Terminated.", e.InstanceId); 
     Console.WriteLine("Exception: {0}\n{1}", 
      e.TerminationException.GetType().FullName, 
      e.TerminationException.Message); 
    } 
    else if (e.CompletionState == ActivityInstanceState.Canceled) 
    { 
     Console.WriteLine("Workflow {0} Canceled.", e.InstanceId); 
    } 
    else 
    { 
     Console.WriteLine("Workflow {0} Completed.", e.InstanceId); 
    } 
}; 

app.Aborted = delegate(WorkflowApplicationAbortedEventArgs e) 
{ 
    Console.WriteLine("Workflow {0} Aborted.", e.InstanceId); 
    Console.WriteLine("Exception: {0}\n{1}", 
     e.Reason.GetType().FullName, 
     e.Reason.Message); 
}; 

app.Idle = delegate(WorkflowApplicationIdleEventArgs e) 
{ 
    Console.WriteLine("Workflow {0} Idle.", e.InstanceId); 
}; 

app.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e) 
{ 
    Console.WriteLine("OnUnhandledException in Workflow {0}\n{1}", 
     e.InstanceId, e.UnhandledException.Message); 

    Console.WriteLine("ExceptionSource: {0} - {1}", 
     e.ExceptionSource.DisplayName, e.ExceptionSourceInstanceId); 
    return UnhandledExceptionAction.Terminate; 
}; 

回答

1

你的 “卸载” 事件处理程序:

syncEvent.Set(); 

,将让等待继续。

事件没有优先级,您可以按照它们发生的顺序获取它们。

+0

syncEvent.Set() - 根据我的理解,这设置事件的状态为发信号,允许一个或多个等待线程继续。它将如何继续等待? – immirza

+0

您的主线程调用syncEvent.WaitOne(),并且它在那里等待,直到另一个线程调用允许主线程继续执行的syncEvent.Set()。 –