सिंक्रोनाइज़ेशन कॉन्टेक्स्ट हमें एक यूआई को एक अलग थ्रेड से अपडेट करने का एक तरीका प्रदान करता है (सिंक्रोनाइज़ द्वारा सेंड मेथड या एसिंक्रोनसली पोस्ट विधि के माध्यम से)।
निम्नलिखित उदाहरण पर एक नज़र डालें:
private void SynchronizationContext SyncContext = SynchronizationContext.Current;
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(Work1);
thread.Start(SyncContext);
}
private void Work1(object state)
{
SynchronizationContext syncContext = state as SynchronizationContext;
syncContext.Post(UpdateTextBox, syncContext);
}
private void UpdateTextBox(object state)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
SynchronizationContext.Current यूआई थ्रेड के सिंक संदर्भ को वापस कर देगा। मुझे इसके बारे में कैसे पता है? हर फॉर्म या WPF ऐप के शुरू होने पर, संदर्भ UI थ्रेड पर सेट किया जाएगा। यदि आप एक WPF ऐप बनाते हैं और मेरा उदाहरण चलाते हैं, तो आप देखेंगे कि जब आप बटन पर क्लिक करते हैं, तो यह लगभग 1 सेकंड के लिए सोता है, फिर यह फ़ाइल की सामग्री को दिखाएगा। आप उम्मीद कर सकते हैं क्योंकि यह अपडेटटैक्सबॉक्स विधि (जो कि वर्क 1 है) के कॉलर थ्रेड को पारित करने की एक विधि है, इसलिए यह सोना चाहिए कि मुख्य UI थ्रेड नहीं, एनओपीई! भले ही Work1 विधि एक थ्रेड के लिए पारित की गई है, ध्यान दें कि यह भी एक ऑब्जेक्ट को स्वीकार करता है जो SyncContext है। यदि आप इसे देखते हैं, तो आप देखेंगे कि UpdateTextBox पद्धति को SyncContext.Post विधि के माध्यम से निष्पादित किया गया है न कि Work1 विधि के माध्यम से। निम्नलिखित पर एक नज़र डालें:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
अंतिम उदाहरण और यह एक ही निष्पादित करता है। यह कार्य करते समय दोनों UI को अवरुद्ध नहीं करता है।
अंत में, एक धागे के रूप में सिंक्रोनाइज़ेशनकोटेक्स्ट के बारे में सोचें। यह एक थ्रेड नहीं है, यह एक थ्रेड को परिभाषित करता है (ध्यान दें कि सभी थ्रेड में सिंककनेक्ट नहीं है)। जब भी हम यूआई को अपडेट करने के लिए उस पर पोस्ट या सेंड मेथड कहते हैं, तो यह मुख्य यूआई थ्रेड से सामान्य रूप से यूआई को अपडेट करने जैसा है। यदि, कुछ कारणों से, आपको UI को एक अलग थ्रेड से अपडेट करने की आवश्यकता है, तो सुनिश्चित करें कि थ्रेड में मुख्य UI थ्रेड का SyncContext है और बस उस पर भेजें या पोस्ट विधि को उस विधि से कॉल करें जिसे आप निष्पादित करना चाहते हैं और आप सभी हैं सेट।
आशा है कि यह आपकी मदद करता है, दोस्त!