19

Functional Programming For Everyday .NET Development में जेरेमी मिलर के अच्छे काम के लिए धन्यवाद, मेरे पास एक वर्किंग कमांड एक्जिक्यूटर है जो मैं चाहता हूं कि वह सब कुछ करे (थ्रेड पूल पर भारी उठाना, परिणाम भेजना या सिंक्रनाइज़ेशन संदर्भ में त्रुटियों को वापस भेजना, और यहां तक ​​कि प्रगति को वापस पोस्ट करना सिंक्रनाइज़ेशन संदर्भ), लेकिन मैं समझा नहीं सकता कि यह थ्रेड-पूल से SynchronizationContext.Send का उपयोग क्यों करता है और Func से भारी उठाने की विधि में पारित किया गया है। मैंने प्रलेखन को कई बार पढ़ा है, लेकिन अंतर में क्या है इसके लिए मुझे सिर्फ आंत महसूस नहीं हो सकता है। मुझे इस तथ्य से क्या प्राप्त होना चाहिए कि किसी को Send कहा जाता है और इसे Post कहा जाता है? मैं समझ जादू तथ्य Send में है और Post "एक तुल्यकालिक अनुरोध शुरू होता है" "एक अतुल्यकालिक अनुरोध शुरू होता है", लेकिन दोनों अनुरोध थ्रेड पूल से आते हैं और भेजे जाने के लिए/वापस यूआई धागा करने के लिए तैनात की जरूरत है।सिंक्रनाइज़ेशन कॉन्टेक्स्ट सैंड और सिंक्रनाइज़ेशन कॉन्टेक्स्ट.पोस्ट के बीच क्या अंतर है?

क्या कोई अंतर बता सकता है, भले ही यह केवल एक निमोनिक डिवाइस है जो मुझे बताता है कि एक दूसरे को चुनने के लिए कब? से _ExecuteCommand विधि नीचे command पैरामीटर के रूप में पारित हो जाता है

private Action _ExecuteCommand 
       (SynchronizationContext context 
       , Action<int, int> progress 
       , Action<int, int> after) 
{ 
    int count = 3; 
    int accumulatedValue = 0; 
    int threadId = Thread.CurrentThread.ManagedThreadId; 
    for (int i = 0; i < count; i++) 
    { 
     Thread.Sleep(1000); 
     context.Post(delegate { progress(i + 1, threadId); }); 
     accumulatedValue += i; 
    } 

    return() => after(threadId, accumulatedValue); 
} 

यही कारण है, ज्यादातर:

मामले यह मायने रखता है में, यह मेरी परीक्षण कोड जहाँ मैं Post का उपयोग प्रगति UI पर वापस भेजने के लिए है मूल लेख, Send का उपयोग करता है पूरा होने और त्रुटि संदेश UI पर वापस भेजने के लिए:

public void Execute(Func<Action> command, Action<Exception> error) 
{ 
    ThreadPool.QueueUserWorkItem(o => 
    { 
     try 
     { 
      Action continuation = command(); 
      _Context.Send(s => continuation()); 
     } 
     catch (Exception e) 
     { 
      _Context.Send(s => error(e)); 
     } 
    }); 
} 
+4

वे वास्तव में बुरी तरह से नामित तरीके हैं। –

उत्तर

23

संदेश - तुल्यकालिक: के लिए इंतजार आर जवाब (या क्रिया पूर्ण)

पोस्ट - अतुल्यकालिक: छोड़ने और

तो अपने उदाहरण सही क्षणों में सही तरीकों का उपयोग करता जारी है। प्रगति अद्यतन पूरा होने तक फॉर-लूप को रोकने की कोई आवश्यकता नहीं है (इसके विपरीत)।
और निष्पादन कार्य को पूरा करने के लिए प्रतीक्षा करना चाहता है, अन्यथा अपवाद हैंडलिंग का कोई उद्देश्य नहीं है।

+0

इसलिए यदि कोई संदेश भेजने के बजाय पोस्ट का उपयोग करता है तो कोई त्रुटि परिणाम नहीं होता है। यह सिर्फ इस बारे में है कि संदेश भेजने/पोस्ट करने के लिए मुझे रोकने के लिए थ्रेड पूल कार्य की आवश्यकता है या नहीं। सही? – flipdoubt

+0

हां, सही .__ –

+2

मैं अभी भी इस से उलझन में हूं। मैंने सोचा कि सिंक्रनाइज़ेशन संदर्भ ने आपको यूआई थ्रेड पर कुछ काम करने का आसान तरीका दिया है, तो क्या आपको इसके लिए इंतजार नहीं करना पड़ेगा? या यह इस तरह काम करता है: आप पृष्ठभूमि थ्रेड पर कुछ काम कर रहे हैं और बीच में आपको कुछ UI कार्य करने की आवश्यकता है और फिर पृष्ठभूमि थ्रेड में जारी रखें। यदि आप उपयोग करते हैं तो बैकग्राउंड थ्रेड यूआई काम खत्म होने तक भाग 2 तक जारी नहीं रहता है, हालांकि यदि आप पृष्ठभूमि थ्रेड पोस्ट करते हैं तो यूआई थ्रेड काम पर इंतजार किए बिना काम करना जारी रहेगा? –