Sync UI vs. Async UI
Questa è la “Commit” di base offerta dall’EditorViewModel
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 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(); }
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.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() ); }
.m