2013-02-19 50 views
5

मैं परतों के बीच एसिंक्रोनस संवाद करने के लिए सबसे अच्छा अभ्यास खोज रहा हूं। मैं उपयोग कर रहा हूँ mvvm light toolkitएमवीवीएम में एसिंक्रोनस क्या है? मॉडल या व्यूमोडेल। सबसे अच्छा अभ्यास?

वर्तमान में मैं मॉडल में एक BackgroundWorker उपयोग करें, क्योंकि मैं स्वत: जनरेट कोड में यह देखा। पृष्ठभूमि कार्यकर्ता के साथ नहीं बल्कि एसिंक कॉल के साथ।

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(); 
} 

अब मैं AsyncDelegateCommand जो ViewModel में अतुल्यकालिक भाग लागू पाया।

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)); 
    } 
} 

मैं सबसे अच्छा अभ्यास के बारे में थोड़ा उलझन में हूं? मैंने बहुत सारे लेख पढ़े हैं। लेकिन किसी भी तरह वे हमेशा अलग राय हैं। क्या बनाए रखने के सामान्य प्रयास के तहत सर्वोत्तम संगतता का कोई प्रावधान है?

विचार के लिए कुछ खाना

मॉडल:

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

क्या कार्य-पैटर्न को पढ़ने के लिए आसान तरीका नहीं होगा? Async/await के साथ .. – JustAnotherUserYouMayKnow

+0

बेशक, लेकिन जहां तक ​​मुझे पता है कि यह केवल .NET 4.5 उपलब्ध है?! –

+0

4.0 और Silverlight के लिए इसका समर्थन करने के लिए एक NuGet पैकेज है 5. इसे अपने प्रोजेक्ट में इंस्टॉल करें और यह एक आकर्षण की तरह काम करता है! http://nuget.org/packages/Microsoft.CompilerServices.AsyncTargetingPack/ – JustAnotherUserYouMayKnow

उत्तर

1

ठीक है, मैं मॉडल की fecthing कहेंगे और यह देखें मॉडल में बदलने async है। यह कौन करता है, आर्किटेक्चर पर निर्भर करता है, यह दृश्य मॉडल पर ही किया जा सकता है या यह देखने के लिए प्रारंभिक वीएम के एसिंक लोड अप और मैपिंग के लिए नियंत्रक परत का उपयोग कर सकता है। इसके अलावा पृष्ठभूमि कार्यकर्ता अतीत हैं, आपको समानांतर संचालन के लिए कार्य वर्ग का उपयोग करना चाहिए। और निश्चित रूप से वीएम से परिवर्तनों पर विचार को सूचित करते समय प्रेषक के माध्यम से आह्वान करना न भूलें।

कोड का नमूना:

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

मैं अपने ViewModel में एसिंक्रोनस कोड डालने का सुझाव देते हैं और अपने मॉडल छोड़ डाटा स्टोर करने की होगी। जब मैं एमवीवीएम पर शुरू कर रहा था, तो मैंने पहली चीज में से एक को अपने मॉडल से तर्क को हटाना था और इसके बजाय इसे मेरे व्यू मॉडल्स में रखना था। हालांकि मैं कहूंगा कि जहां आप अपना कोड डालते हैं, तब तक कोई फर्क नहीं पड़ता क्योंकि कोड पढ़ने वाले सभी लोग इसे समझ सकते हैं।

संबंधित मुद्दे