2011-06-07 46 views
5

मान लें कि मैं एक WCF सेवा के लिए एक कॉल कर Silverlight अनुप्रयोग है:चांदी के प्रकाश डब्ल्यूसीएफ कॉल पर पूरा ईवेंट हैंडलर क्या थ्रेड कॉल करता है?

void DoStuff() 
{ 
    MyProxy proxy = new MyProxy(); 
    proxy.DoStuffCompleted += DoStuffCompleted; 
    proxy.DoStuffAsync(); 
} 

void DoStuffCompleted(object sender, DoStuffCompletedEventArgs e) 
{ 
    // Handle the result. 
} 

DoStuff यूआई धागा द्वारा कहा जाता है। अंततः DoStuffCompleted विधि को कौन सा थ्रेड कॉल करेगा? यदि मैं एक ही समय में दो एसिंक कॉल का आह्वान करता हूं, तो क्या संभावना है कि दोनों पूर्ण घटनाओं को अलग-अलग धागे पर एक साथ निकाल दिया जाए?

+0

दृश्यता बढ़ाने के लिए सी # और .NET टैग जोड़ा गया। –

उत्तर

3

कॉलबैक मुख्य थ्रेड पर लागू किया जा होगा। एकाधिक प्रतिक्रिया एक साथ नहीं होगी। प्रतिक्रिया घटनाओं का क्रम अप्रत्याशित हो सकता है।

proxy.DoStuffAsync(object userState)

यह तो आप अंतर कर सकते हैं जो प्रतिक्रिया आप साथ काम कर रहे आप प्रत्येक कॉल के लिए कुछ अद्वितीय भेज सकेंगे: आप proxy.DoStuffAsync का अधिभार कि स्वीकार करता है "उपयोगकर्ता राज्य" वस्तु का उपयोग कर सकते । याद रखें कि यदि डब्ल्यूसीएफ कॉल एक त्रुटि देता है तो आपके पास कोई रिटर्न वैल्यू नहीं है - इसलिए उपयोगकर्तास्टेट यह जानने का एकमात्र तरीका हो सकता है कि कौन सा कॉल विफल हुआ (यदि यह मायने रखता है)।

अद्यतन:

Silverlight web service callback performance बहुत अधिक जानकारी के लिए टोमेक के ब्लॉग के लिए वहाँ लिंक का पालन करें: यह कैसे एक और धागा का उपयोग करने के बारे में

मिले कुछ और जानकारी (इसी तरह)।

+0

धन्यवाद, यह डीबगर का उपयोग करके मुझे पता चला है। क्या आप जानते हैं कि यह कहीं भी स्पष्ट रूप से दस्तावेज है? –

1

पूर्ण घटना यूआई थ्रेड की तुलना में एक अलग थ्रेड पर होगी। कई पूर्ण घटनाओं को अलग-अलग धागे पर एक साथ निष्पादित किया जा सकता है क्योंकि परिणाम को संभालने के लिए थ्रेड पूल का उपयोग किया जाता है।

+0

आईएमएचओ, यह WPF (और सिल्वरलाइट) के साथ महत्वपूर्ण नहीं है। 'डिस्पैचर' यूआई तत्वों के कारण हमेशा सही धागे से कहा जाता है। मुझे खेद है कि मैं अधिक विस्तृत जानकारी प्रदान नहीं कर सकता, शायद यहां कुछ उपयोगी है: http://msdn.microsoft.com/en-us/library/ms741870.aspx –

+0

@Vladislav: मुझे यकीन नहीं है कि आपका क्या मतलब है "हमेशा के लिए सही धागे से बुलाया प्रतीत होता है"। यहां कोई जादू नहीं है, यदि आप यूआई थ्रेड की तुलना में थ्रेड __other__ से यूआई तत्व में हेरफेर करने का प्रयास करते हैं तो आपको अपवाद मिलेगा। यह जानना महत्वपूर्ण है कि आप यूआई थ्रेड पर हैं या नहीं। आम तौर पर डब्लूसीएफ को पूरा करने पर आप यूआई को अपडेट करना चाहते हैं, डिस्पैचर के माध्यम से ऐसा करने से पहले यूआई थ्रेड पर स्विच करना महत्वपूर्ण है। – AnthonyWJones

+1

@ एंथनी WJones: मैंने कुछ त्वरित परीक्षण किया और संदर्भ.cs कोड के माध्यम से कदम रखा और आंतरिक "नलसाजी" कोड को एक कार्यकर्ता धागे पर बुलाया जाता है, लेकिन पूरा कार्यक्रम मुख्य धागे पर निकाल दिया जाता है। क्या आप जानते हैं कि यह ऐसा कुछ है जिसे भरोसा किया जा सकता है, ताकि कॉलिंग यूआई घटकों में synchrnonization छोड़ा जा सकता है? –

0

Asynch कॉल background thread pool में निष्पादित किए जाते हैं। प्रत्येक एसिंक कॉल के लिए आपके पास पूल से अलग धागा होगा।

DoStuffCompleted पृष्ठभूमि पूल थ्रेड में निष्पादित किया जाएगा।

अब, यह ध्यान रखें कि इस विधि पृष्ठभूमि कार्यकर्ता धागे पर कहा जाता है महत्वपूर्ण है। यदि हम को नए प्राप्त डेटा के साथ यूआई अपडेट करना चाहते हैं (मान लें कि हम डेटा डेटा प्रदर्शित करने के लिए डेटा ग्रिड नियंत्रण अपडेट करना चाहते हैं), हमें यूआई थ्रेड पर ऐसा करने के लिए सावधान रहना होगा। हम नहीं करते हैं, तो अजीब चीजों के सभी ढंग हो सकता है और हम एक कठिन समय निदान जो बग को ठीक करने (from here)

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