2012-12-14 5 views
6

मैं विधियों के बड़े सेट के लिए पुनर्वितरण को प्रतिबंधित करना चाहता हूं।क्या फ्रेमवर्क ने पुनर्वित्त का पता लगाने के लिए एपीआई समर्पित किया है?

bool _isInMyMethod; 
void MyMethod() 
{ 
    if (_isInMethod) 
     throw new ReentrancyException(); 

    _isInMethod = true; 
    try 
    { 
     ...do something... 
    } 
    finally 
    { 
     _isInMethod = false; 
    } 
} 

यह हर विधि के लिए यह करने के लिए कठिन है:

एकल विधि के लिए

इस कोड काम करता है।
तो मैं का उपयोग किया है StackTrace वर्ग:

 public static void ThrowIfReentrant() 
     { 
      var stackTrace = new StackTrace(false); 
      var frames = stackTrace.GetFrames(); 
      var callingMethod = frames[1].GetMethod(); 
      if (frames.Skip(2).Any(frame => EqualityComparer<MethodBase>.Default.Equals(callingMethod,frame.GetMethod()))) 
       throw new ReentrancyException(); 
     } 

यह ठीक काम करता है, लेकिन अधिक एक हैक की तरह दिखता है।

क्या .NET Framework में पुनर्वित्त का पता लगाने के लिए विशेष API है?

+2

आप पुनर्वित्त की परवाह क्यों करते हैं? –

+0

कोड लिखें जहां पुनर्वित्त की अपेक्षा की जाती है, तो आप इसे पुन: दर्ज कर सकते हैं। – Jodrell

+0

विरासत कोड। खिड़कियों के बीच हमारे पास कई परस्पर निर्भरताएं हैं। एकल कार्रवाई घटनाओं, अद्यतनों, डीबी अनुरोधों के कई अनावश्यक दोहराव कैस्केड का कारण बन सकती है। और हर किसी के लूप को किसी की आंखों से पहचानना मुश्किल है। –

उत्तर

3

मैं आपकी समस्या का समाधान करने के लिए पोस्टशर्प का उपयोग करने की सलाह देता हूं। यद्यपि यह केवल एक विशिष्ट कारण के लिए वाणिज्यिक उपकरण का उपयोग करना महंगा हो सकता है, मेरा सुझाव है कि आप एक नज़र डालें क्योंकि यह टूल एओपी (लॉगिंग, लेनदेन प्रबंधन, सुरक्षा और अन्य) द्वारा हल किए जाने के लिए उपयुक्त अन्य समस्याओं को हल कर सकता है। कंपनी की वेबसाइट here है और आप उदाहरण here पर एक नज़र डाल सकते हैं। PostSharp here में उदाहरणों के साथ एओपी पद्धति पर Pluralsight का एक अच्छा कोर्स है। सौभाग्य!

+0

हां, हमारे पास बहुत सी चीजें हैं। मुझे PostSharp में दिलचस्पी है और इसे मेरी सीखने की योजना में है। लेकिन हम शायद गतिशील हस्तक्षेप के रूप में एओपी के साथ शुरू करेंगे ... बाद में, उपयुक्त डी कंटेनर को अपनाने के बाद। =) –

+0

@ voroninp - क्या आपका मतलब है कि आप गतिशील प्रॉक्सी जैसे टूल का उपयोग करना चाहते हैं? – Ikaso

+0

@lkaso हाँ। इस दृष्टिकोण के साथ कुछ गड़बड़ है? –

1

सामान्य .NET दृष्टिकोण synchronization के लिए कुछ थ्रेड को अवरुद्ध करने के बजाय कुछ अपवादों को फेंकने के बजाय कुछ अपवादों का उपयोग करना है।

+0

इससे मदद नहीं मिलेगी। यह एसिंक ऑपरेशन का मामला नहीं है। हमारे पास घटनाओं के सीमित चक्र हैं: बी आग लगती है, कुछ करता है, कुछ करता है, सी और सी द्वारा संचालित घटना को बढ़ाता है ए के साथ कुछ करता है जिससे ए को घटना को फिर से उठाना पड़ता है। –

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