Monday, January 18, 2010

Sync UI vs. Async UI

è indubbio che un’interfaccia utente asincrona sia veramente un beneficio per l’utente, basti solo pensare alla bile che consumo io tutti i giorni per colpa di Outlook, ma è altrettanto indubbio che per lo sviluppatore, quindi sempre io :-), il task sia tutto tranne che semplice…
Questa è la “Commit” di base offerta dall’EditorViewModel del mio toolkit:
protected virtual void CommitEdit()
{
    var data = this.EditContext.Entity;
    if( this.IsDirty )
    {
        data = this.DataSource.CommitChanges();
    }

    var dc = this.EditContext.DataPolicy.DataContext;

    var currentState = EntityTransientState.Persistent;
    var state = this.Memento.GetEntityState( this.DataSource );
    if( ( state & EntityTrackingStates.IsTransient ) == EntityTrackingStates.IsTransient )
    {
        currentState = EntityTransientState.Transient;
    }

    var args = new CommitRequestArgs( data, dc, currentState );

    this.Memento.AcceptChanges();
    
    this.EditContext.Commit( args );

    if( this.EditContext.DataPolicy.CommitPolicy == EditorCommitPolicy.HandledByEditor )
    {
        this.OnCommitEdit(args);
    }

    this.OnEditCommited();
}
Fa un sacco di belle cose, di cui parleremo, ma è sincrona alla UI quindi se è complessa e comporta un set oneroso di operazioni sul db costa, renderla asincrona è apparentemente banale:
protected override void CommitEdit()
{
    Action commit = () => base.CommitEdit();

    AsyncWorker.Using( new { Host = this, Action = commit } )
        .Configure( cfg =>
        {
            cfg.Before = e => e.Argument.Host.IsBusy = true;
            cfg.After = e => e.Argument.Host.IsBusy = false;
        } )
        .Execute( e => e.Argument.Action() );
}
In un ViewModel specializzato… ma non è tutto oro quel che luccica e durante una commit può succedere di tutto e se questo di tutto è asincrono è un filino più complesso da gestire.
.m

3 comments:

  1. Imported comment, original author: Gian Maria

    Sante parole, solo che in molti casi la logica asincrona è l'unico modo di procedere.

    La cosa che trovo più difficile da fare è la validazione, comunque l'utente è solitamente molto più felice... outlook docet

    ReplyDelete
  2. Imported comment, original author: Corrado Cavalli

    La risposta alla validazione sta nell'interfaccia INotifyDataErrorInfo :-)

    Mauro, che fai, col tuo Captcha mi fa lavorare gratis per Google :-)

    ReplyDelete
  3. Imported comment, original author: Mauro Servienti

    - +1 per INotifyDataErrorInfo :-)

    - per il re-comediavolosidice lamentatevi con Ughetto :-)

    .m

    ReplyDelete