2009-11-06 10 views
15

वीक रेफरेंस का उपयोग करते समय, हम कैसे सुनिश्चित कर सकते हैं कि लक्ष्य ISAlive और .Target कॉल के बीच एकत्र नहीं किया गया है?वीक रेफरेंस की थ्रेड सुरक्षा

उदाहरण के लिए:

if (myWeakReference.IsAlive) 
{ 
    // How can we be sure the object is still alive while here? 
    ((MyType)myWeakReference.Target).Foo(); 
} 

उत्तर

25

बस Target हो और जाँच करें कि क्या यह शून्य नहीं है:

object target = myWeakReference.Target; 
if (target != null) 
{   
    ((MyType)target).Foo(); 
} 

docs for IsAlive विशेष रूप से कहते हैं:

क्योंकि एक वस्तु संभावित हो सकता है कचरा संग्रहके लिए पुनः दावा किया गया IsAlive प्रॉपर्टी के बाद तुरंत इस संपत्ति का उपयोग करके अनुशंसित नहीं है जब तक कि आप केवल झूठी वापसी मान के लिए परीक्षण नहीं कर रहे हैं।

2

आप नहीं कर सकते। MyWeakReference असाइन करें। एक चर के लिए लक्ष्य, और शून्य के लिए जाँच करें।

4

"IsAlive" संपत्ति का एकमात्र उद्देश्य उन परिस्थितियों के लिए है जहां आप कुछ कार्रवाई करना चाहते हैं यदि वीक रेफरेंस का लक्ष्य पहले से ही नष्ट हो चुका है, लेकिन जहां आप गलती से इसे ज़िंदा रहने से जोखिम नहीं लेना चाहते हैं । अगर कोई कहना था, उदा।

 
    if (someWeakReference.Target == null) 
    cleanup_related_object(); 

और कचरा-कलेक्टर ट्रिगर सही कोड है कि someWeakReference.Target का मूल्यांकन करने के बाद (जो भी कारण के लिए) के लिए गए थे, जीसी उस वस्तु के लिए एक मजबूत संदर्भ वहाँ अस्तित्व में है कि नोटिस और अपने संग्रह में बाधा होगी। दूसरी ओर, कह रही:

 
    if (!someWeakReference.IsAlive) 
    cleanup_related_object(); 

वहाँ गलती से someWeakReference का लक्ष्य के जीवनकाल के समय को बढ़ाने को लक्षित

का कोई खतरा नहीं होगा