2013-02-19 23 views
5

Katmanlar arasında eşzamansız iletişim kurmak için en iyi uygulamayı arıyorum. Ben autogenerated kodunda bu gördüğüm için mvvm light toolkitMVVM'de asenkron nedir? Model veya ViewModel. En iyi uygulama?

anda ben modelinde bir backgroundworker kullanmak kullanıyorum. Backgroundworker ile değil, async çağrısı.

public void GetConfig(Action<Config, Exception> callback) 
{ 
    BackgroundWorker backgroundWorker = new BackgroundWorker(); 
    backgroundWorker.DoWork += (backgroundWorkerSender, backgroundWorkerArgs) => 
    { 
     try 
     { 
      backgroundWorkerArgs.Result = AppEnvironment.Instance.Config; 
     } 
     catch (Exception exception) 
     { 
      backgroundWorkerArgs.Result = null; 
     } 
    }; 

    backgroundWorker.RunWorkerCompleted += (backgroundWorkerSender, backgroundWorkerArgs) => 
    { 
     if (backgroundWorkerArgs.Result != null) 
     { 
      callback((Config) backgroundWorkerArgs.Result, null); 
     } 
     else 
     { 
      /* ToDo: exceptionhandling */ 
     } 
    }; 

    backgroundWorker.RunWorkerAsync(); 
} 

Şimdi ViewModel asenkron bölümünü uygulayan AsyncDelegateCommand bulundu.

private ICommand _refreshObjectDefinitionCommand; 
public ICommand RefreshObjectDefinitionCommand 
{ 
    get 
    { 
     return _refreshObjectDefinitionCommand 
      ?? (_refreshObjectDefinitionCommand = new AsyncDelegateCommand(delegate 
       { 
        IsBusy = true; 
        _dataService.GetObjectDefinition(
        (xmlObjectDef, errorConfig) => 
        { 
         if (errorConfig != null) 
         { 
          /* ToDo Lenz: exceptionhandling */ 
          return; 
         } 

         ObjectDefinition = xmlObjectDef; 
        }); 

        _dataService.GetObjectDefinitionTreeView(
         (treenodes, errorConfig) => 
         { 
          if (errorConfig != null) 
          { 
           /* ToDo Lenz: exceptionhandling */ 
           return; 
          } 

          TreeNodes = treenodes; 
         }); 
       }, 
           () => _isConnected, o => IsBusy = false, exception => IsBusy = false)); 
    } 
} 

En iyi uygulama hakkında biraz kafam karıştı mı? Çok fazla makale okudum. Fakat bir şekilde her zaman farklı görüşlerdirler. Korumak için normal çabaya göre en iyi uyumluluk için herhangi bir hüküm var mı?

düşünce için bazı gıda

Modeli:

http://csharperimage.jeremylikness.com/2009/12/simplifying-asynchronous-calls-in.html

http://www.dzone.com/articles/mvvmlight-and-async

ViewModel

http://www.codeproject.com/Articles/123183/Asynchronus-MVVM-Stop-the-Dreaded-Dead-GUI-Problem

http://www.codeproject.com/Articles/441752/Async-MVVM-Modern-UI

+0

Görev-deseni okunması daha kolay olmaz mıydı? Async/beklemek ile .. – JustAnotherUserYouMayKnow

+0

tabii, ama bildiğim kadarıyla sadece. Net 4.5 kullanılabilir beri?!? –

+0

4.0 ve silverlight 5 için onu desteklemek için bir NuGet paketi var. Projenize yükleyin ve bir çekicilik gibi çalışır! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow

cevap

1

Eh, modelin fecthing demek ve Görünüm Modeli dönüştürmeye zaman uyumsuz olduğunu ederim. Kim yapar, mimariye bağlıdır, bu görünüm modelinin kendisi üzerinde yapılabilir veya bu tür uyumsuz yük yüklemeleri için denetleyici katmanını kullanabilir ve ilklendirilmiş VM'nin görüntülenmesi için haritalama yapabilir. Ayrıca, arka plandaki çalışanlar paralel işlemler için Görev sınıfını kullanmanız gereken geçmişlerdir. Ve tabii ki, VM'den gelen değişiklikler hakkındaki görüşü bildirirken dağıtımcıdan çağrı yapmayı da ihmal etmeyin.

kod örneği:

Task<string>.Factory.StartNew(() => 
{ 
    string text = GetArticleText(); 
    Application.Current.Dispatcher.BeginInvoke(new Action(()=>MyTextProperty = text)); 
}); 
1

Ben ViewModel asenkron kod koyarak önermek ve verileri depolamak için Model bırakacaktı. MVVM'ye başladığımda, öğrendiğim ilk şeylerden biri mantığı Modellerim'den kaldırmak ve bunun yerine ViewModel'imde tutmaktı. Kodunuzu koydukça, kodu okuyan herkesin bunu anlayabileceği kadar önemli olmadığını söyleyebilirim.

İlgili konular