मैंने अभी "सी # 4.0 में संक्षेप में पढ़ना समाप्त कर दिया है" (O'Reilly) और मुझे लगता है कि यह प्रोग्रामर के लिए सी # पर स्विच करने के इच्छुक एक महान पुस्तक है, लेकिन यह मुझे आश्चर्यचकित कर दिया। मेरी समस्या using
कथन की परिभाषा है। पुस्तक (पी। 138) के अनुसारक्या सी # का उपयोग कथन का उपयोग कर सुरक्षित है?
using (StreamReader reader = File.OpenText("file.txt")) {
...
}
ठीक करने के बराबर है:
StreamReader reader = File.OpenText("file.txt");
try {
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
मान लीजिए, तथापि, कि यह सच है और कहा कि इस कोड को एक अलग थ्रेड में मार डाला गया है। यह धागा अब thread.Abort()
के साथ निरस्त कर दिया गया है, इसलिए ThreadAbortException
फेंक दिया गया है और मान लीजिए कि पाठक को प्रारंभ करने के बाद और try..finally
खंड दर्ज करने से पहले थ्रेड ठीक है। इसका मतलब यह होगा कि पाठक का निपटारा नहीं किया गया है!
सम्भावित समाधान इस तरह से कोड करने के लिए होगा:
StreamReader reader = null;
try {
reader = File.OpenText("file.txt");
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
यह गर्भपात सुरक्षित होगा।
मेरे सवालों के लिए अब:
- किताब सही के लेखक हैं और
using
बयान गर्भपात-सुरक्षित नहीं है या वे गलत हैं और यह मेरी दूसरी समाधान में तरह बर्ताव करता है? - यदि
using
पहले संस्करण (abort-safe नहीं) के बराबर है, तोfinally
में यह क्यों जांचता है? - पुस्तक के अनुसार (पृष्ठ 856),
ThreadAbortException
प्रबंधित कोड में कहीं भी फेंक दिया जा सकता है। लेकिन शायद अपवाद हैं और पहला संस्करण निरस्त-सुरक्षित है?
संपादित करें: मुझे पता है कि thread.Abort()
का उपयोग कर अच्छा अभ्यास माना जाता है। मेरी रुचि पूरी तरह सैद्धांतिक है: using
कथन बिल्कुल व्यवहार कैसे करता है?
क्या होगा यदि आपको 'निपटान' कॉल से पहले 'अंत में' ब्लॉक के अंदर 'थ्रेडएबॉर्ट अपवाद' मिलता है? – liori
आश्चर्यचकित करना कि थ्रेड को कॉल करते समय व्यवहार क्या होता है।Abort' थोड़ा सोच रहा है कि क्या आपकी कार पर एयर बैग ** वास्तव में ** काम करते हैं। अगर आपको पता होना चाहिए, तो आपको पहले से ही बहुत बड़ी समस्या मिली है। –
बिल्कुल .... आप दस लाख अलग-अलग समय के साथ आ सकते हैं जहां बुरी चीजें होती हैं। असल में, एक थ्रेडअबॉर्ट एक संकेत है कि कुछ बहुत ही भयानक पहले से ही हुआ है। एक गैर-डिस्प्ले फ़ाइल रीडर उस बिंदु पर आपकी चिंताओं का कम से कम है। – Clyde