आम दृष्टिकोण आपके व्यू मॉडल (शायद सभी दृश्य मॉडल के लिए बेस क्लास में) में डिस्पैचर संपत्ति होना है जिसे बाहर इंजेक्शन दिया जा सकता है। इसे एक दृश्य मॉडल में रखना ठीक है क्योंकि मॉडल को यूआई अवधारणाओं से अवगत होना चाहिए, लेकिन इसे विशेष दृश्य (लेआउट, नियंत्रण इत्यादि) से अवगत नहीं होना चाहिए और निश्चित रूप से इसे दृश्य का संदर्भ नहीं होना चाहिए।
आप क्या कर सकते हैं यह है कि आप एक सहायक या सेवा बनाकर डिस्पैचर थ्रेड पर अपना कोड प्रेषण करना आसान बना सकते हैं जो प्रेषक को दूर कर देगा। उदाहरण के लिए, अगर आप इस तरह एक सहायक बना सकते हैं:
public class AsyncHelper
{
public static void EnsureUIThread(Action action)
{
if (Application.Current != null && !Application.Current.Dispatcher.CheckAccess())
{
Application.Current.Dispatcher.BeginInvoke(action, DispatcherPriority.Background);
}
else
{
action();
}
}
}
और जब भी आप आप नमूदार संग्रह अद्यतन करने की जरूरत है, तो आप आपको लगता है कि सहायक विधि में कोड लपेट:
AsyncHelper.EnsureUIThread(() =>
{
// Update you observable collections here
});
या, आप आगे जा सकते हैं और घोषणात्मक रूप से निर्दिष्ट करने के लिए एओपी (उदाहरण के लिए PostSharp) का उपयोग करें (गुणों का उपयोग करके) कि यूआई थ्रेड में एक विधि को निष्पादित किया जाना चाहिए।
और अंत में, कृपया ध्यान दें कि आपको केवल यूआई थ्रेड में संग्रह अपडेट भेजना है। सामान्य गुणों को पृष्ठभूमि थ्रेड से सुरक्षित रूप से अपडेट किया जा सकता है। अद्यतन बाध्यकारी तंत्र द्वारा स्वचालित रूप से यूआई थ्रेड पर प्रेषित किए जाएंगे। शायद पृष्ठभूमि थ्रेड से संग्रह में WPF अद्यतनों के भविष्य के संस्करणों में भी समर्थित किया जाएगा।
स्रोत
2011-02-10 10:44:15
+1 क्योंकि आपने जेसन से एमवीवीएम पर अद्भुत वीडियो का संदर्भ दिया :)। मुझे लगता है कि मैं हर जवाब को ऊपर उठाऊंगा जिसमें इसका एक लिंक होगा। पर्याप्त तनाव नहीं कर सकता कि यह कितना अच्छा है। खैर, और आपका जवाब सही है। – Anvaka