2009-09-03 8 views
15

मैं हाल ही में निम्नलिखित पैटर्न देखा है, लेकिन मैं पूरी तरह से CompletedSynchronously संपत्ति के उपयोग समझ नहीं है: फिर सेAsyncCallBack CompletedSynchronously

IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel); 
if (channelOpenResult.CompletedSynchronously) 
{ 
    CompleteOpenChannel(channelOpenResult); 
} 

और फिर कॉलबैक में,:

void OnOpenCompleteChannel(IAsyncResult result) 
{ 
    if (result.CompletedSynchronously) 
     return; 
    else 
     CompleteOpenChannel(result); 
} 

और कोड में कहीं भी एक समारोह है:

void CompleteOpenChannel(IAsyncResult result) ... 

क्या यह हैंडल करने का एक तरीका है एसिंक्रोनस कॉल अलग-अलग निर्भर करता है कि यह सीधे पूर्ण हो या नहीं? लेकिन इस मामले में इसका उपयोग क्यों करें, क्योंकि AsyncCallback हमेशा कहा जाएगा (यह होगा?)? क्या कोई ऐसा उदाहरण दे सकता है जहां कॉल सिंक्रनाइज़ किया गया हो?

उत्तर

8

this blog देखें। एक सामान्य पैटर्न एक लूप में एसिंक काम करता है, और पूर्ण सिंक्रनाइज़ की जांच करने से उस मामले से बचने में मदद मिलती है जहां आपको 'दुर्भाग्यपूर्ण' मिलता है और एसिंक कॉल का एक समूह सिंक पूरा करने के लिए होता है और आप StackOverflowException को जोखिम देते हैं। (उदाहरण के लिए यदि आप नेटवर्क पर डेटा पढ़ रहे हैं, और जो डेटा आप पढ़ रहे हैं वह पहले से ही तार पर आ गया है और buffered है, तो आपका async कॉल सिंक्रनाइज़ हो सकता है, जिसका अर्थ है कि आपकी कॉलबैक को उसी थ्रेड पर कॉल किया जाता है (एक लम्बे के साथ स्टैक), जिसका अर्थ है कि आप एक लूप में एक और एसिंक कॉल शेड्यूल नहीं करते हैं।)

0

इस document के अनुसार आप एक सिंक्रोनस और एएसआईएनसी कॉलबैक के साथ कॉल की आपूर्ति कर सकते हैं, और केवल तभी जब कॉल को सिंक्रनाइज़ तरीके से संभाला नहीं गया था, तो क्या यह ASync विधियों को कॉल करेगा। मुझे नहीं लगता कि यह वास्तव में सिल्वरलाइट पर लागू होता है (क्योंकि सभी सिल्वरलाइट कॉल एक डिग्री के लिए एएसआईएनसी हैं) लेकिन शायद अन्य .NET अनुप्रयोगों में कस्टम कारखानों के लिए अधिक उपयोग किया जाता है।

उम्मीद है कि इससे मदद मिलती है।

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

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