2009-05-08 16 views
10

नीचे दिए गए कोड के दो टुकड़ों के बीच क्या अंतर है? क्या दूसरे का उपयोग करने में कोई समस्या होगी?थ्रेडिंग और लैम्ब्डा एक्सप्रेशन

परिदृश्य 1:

private void Log(Exception e) 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(Log), e); 
} 

private void Log(object obj) 
{ 
    Exception e = (Exception)obj; 
    Logger.Log(e); 
} 

परिदृश्य 2

private void Log(Exception e) 
{ 
    ThreadPool.QueueUserWorkItem(
     (obj) => 
      { 
       Logger.Log(e); 
      }); 
} 

परिदृश्य 2 में, मैं ThreadPool करने के लिए एक पैरामीटर के रूप में में अपवाद गुजर नहीं कर रहा हूँ। अपवाद वस्तु का धागा marshalling कैसे होता है? क्या कोई समस्या होगी? अगर ऐसा करने की सीमाएं क्या हैं? बड़ा फायदा यह है कि आप किसी भी पैरामीटर में आसानी से पास कर सकते हैं।

उत्तर

14

एकमात्र अंतर यह है कि परिदृश्य में आप e चर पर बंद कर रहे हैं जो प्रभावी रूप से ढेर परिवर्तनीय e को एक कस्टम प्रकार में ले जाता है जो ढेर में स्थानांतरित हो जाता है ताकि आप इसे खो न सकें।

मुझे लगता है कि यह ठीक काम करना चाहिए।

संपादित करें: प्रदर्शन के लिए, दो परिदृश्यों के बीच कोई महत्वपूर्ण अंतर नहीं होना चाहिए। परिदृश्य 1 में आप state को QueueUserWorkItem विधि में अपवाद पास कर रहे हैं जो आंतरिक रूप से उस अपवाद संदर्भ को ढेर पर ले जाता है। एकमात्र ओवरहेड यह है कि जब आप बंद करने का उपयोग करते हैं तो यह है कि संकलक आपके लिए एक प्रकार बनाता है और उस प्रकार के फ़ील्ड के रूप में किसी भी कैप्चर किए गए चर को स्टोर करता है।

+0

वहाँ किसी भी प्रदर्शन निहितार्थ हैं? –

+0

अच्छा जवाब। दरअसल, लैम्ब्डा अभिव्यक्ति एक बंद (http://en.wikipedia.org/wiki/Closure_(computer_science) उत्पन्न करती है) ताकि चर (सामान्य मामले में एक से अधिक हो) को कहीं और संदर्भित किया जा सके। – Noldorin

+0

@anon: नहीं, जहां तक ​​मुझे पता है वहां कोई प्रदर्शन प्रभाव नहीं होना चाहिए। – Noldorin

1

बस ध्यान दें, लैम्ब्डा के बजाय, आप एक गुमनाम विधि के साथ भी ऐसा ही हो सकता है, और यह भी सी # 2.0 में काम करेगा:

ThreadPool.QueueUserWorkItem(delegate(Object e) 
    { 
     Logger.Log(e as Exception); 
    }); 
+0

+1 आपने जो पोस्ट किया है वह वही है जो संकलक ओपी के प्रश्न में लैम्ब्डा स्टेटमेंट के लिए उत्पन्न करता है। –

+0

हां, लेकिन यदि ओपी में अधिक पैरामीटर शामिल थे, तो क्या अनाम विधि ने काम किया होगा? –

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