Roberto Brunetti

Developing in the cloud

.NET Programming

Archives

March 2008 - Posts

Nuovo Corso DevLeap

Ho appena pubblicato un nuovo corso DevLeap dedicato all'accesso e alla replica dei dati verso dispositivi mobile. Per dispositivo mobile si intende il classico palmare, i notebook, gli UMPC, i Tablet e perché no anche i normali Desktop.

L'idea é nata dal fatto che sulla piazza troviamo diverse tecnologie di replica dei dati che trattiamo nei nostri corsi mobile. Con l'uscita di .NET 3.5 ha visto la luce anche ADO.NET Sync Service e quindi abbiamo pensato di creare un corso apposito per analizzare nel dettaglio le varie tecnologie mettendole a confronto. Visto che ADO.NET Sync Service usa SQL CE 3.5 come store di informazioni la prima parte del corso affronta le metodologie e le tecniche piú efficienti di accesso ai dati verso SQLCE, tecniche spesso differenti rispetto a SQLServer/SQLExpress.

Se siete interessati ecco la scheda tecnica dettagliata.

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)

     }
}