Roberto Brunetti

ASP.NET - Mobility
Team System

SharePoint Conference

.NET Programming

Corsi

SharePoint

Workflow Foundation: State Machine Event

Ieri, al lancio di Visual Studio 2008, mi è arrivata questa domanda dopo la mini-sessione su Workflow Foundation. Condivido la risposta con tutti.

"Come posso sapere quali eventi attente il workflow a stati quando si trova in uno stato".

Gli eventi inviati verso una workflow instance vengono inviati all'istanza tramite una coda. La coda viene creata dalle activity di tipo HandleExternalEventActivity (o derivate ovviamente) durante la sua inizializzazione. Questa coda, di tipo EventQueueName viene creata in questo modo:

protected sealed override void Initialize(IServiceProvider provider)
{
    if (provider == null)
    {
        throw new ArgumentNullException("provider");
    }
    if ((!base.IsDynamicActivity && !this.IsNestedUnderMultiInstanceContainer) || this.IsInitializingUnderMultiInstanceContainer)
    {
        Type interfaceType = this.InterfaceType;
        string eventName = this.EventName;
        IComparable comparable = null;
        if (CorrelationResolver.IsInitializingMember(interfaceType, eventName, null))
        {
            comparable = new EventQueueName(interfaceType, eventName);
        }
        base.SetValue(QueueNameProperty, comparable);
        CorrelationService.Initialize(provider, this, interfaceType, eventName, base.WorkflowInstanceId);
    }
}

Quando il workflow si trova in uno stato che accetta una serie di eventi la collezione di WorkflowQueueInfo ci mette a disposizione le informazioni sulle code. E' sufficiente quindi fare un ciclo su tale collezione, verificare che si tratti di una EventQueueName (potrebbero essere attive anche code che non riguardano gli eventi di scambio dati con l'host) e ottenere le informazioni sull'evento in ascolto.

Ecco il codice:

ReadOnlyCollection<WorkflowQueueInfo> queueInfoData = this.workflowInstance.GetWorkflowQueueData();
if (queueInfoData != null)
{
    foreach (WorkflowQueueInfo info in queueInfoData)
    {
       
EventQueueName eventQueue = info.QueueName as EventQueueName;
        if (eventQueue != null)
           
eventQueue.MethodName   // Otteniamo il nome dell'evento (occhio ai nomi: la proprietà si chiama MethodName)

     }
}