मैं पृष्ठभूमि थ्रेड पर चलाने के लिए एक कार्य ट्रिगर करना चाहता हूं। मैं कार्यों को पूरा करने पर इंतजार नहीं करना चाहता हूं।क्या यह एक टीपीएल कार्य वस्तु पर निपटान() को कॉल करने के लिए स्वीकार्य माना जाता है?
.net 3.5 में मैं इस किया होता:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
.net 4 TPL में सुझाव दिया तरीका है। आम पैटर्न मैं सिफारिश देखा है:
Task.Factory.StartNew(() => { DoSomething(); });
हालांकि, StartNew()
विधि एक Task
वस्तु जो IDisposable
लागू करता है देता है। यह उन लोगों द्वारा अनदेखा किया जाता है जो इस पैटर्न की अनुशंसा करते हैं। Task.Dispose()
विधि पर एमएसडीएन दस्तावेज कहता है:
"कार्य को अपना अंतिम संदर्भ जारी करने से पहले हमेशा निपटान करें।"
आप इसे पूरा होने तक किसी कार्य पर निपटान नहीं कर सकते हैं, इसलिए मुख्य थ्रेड प्रतीक्षा और कॉल निपटान करने से पहले पृष्ठभूमि थ्रेड पर करने का बिंदु हार जाएगा। ऐसा कोई भी पूर्ण/समाप्त ईवेंट प्रतीत नहीं होता है जिसका उपयोग क्लीनअप के लिए किया जा सकता है।
कार्य वर्ग पर एमएसडीएन पृष्ठ इस पर टिप्पणी नहीं करता है, और पुस्तक "प्रो सी # 2010 ..." एक ही पैटर्न की सिफारिश करती है और कार्य निपटान पर कोई टिप्पणी नहीं करती है।
मुझे पता है कि अगर मैं इसे छोड़ देता हूं तो फाइनलइज़र इसे अंत में पकड़ लेगा, लेकिन क्या यह वापस आ जाएगा और जब मैं बहुत सारी आग कर रहा हूं तो मुझे काट देगा & इस तरह के कार्यों को भूल जाओ और फाइनलज़र थ्रेड को अभिभूत कर दिया जाए?
तो मेरी प्रश्न हैं:
- यह स्वीकार्य है इस मामले में
Task
वर्ग परDispose()
फोन नहीं करने के लिए? और यदि हां, तो जोखिम और नतीजे क्यों हैं? - क्या कोई दस्तावेज है जो इस पर चर्चा करता है?
- या क्या
Task
ऑब्जेक्ट का निपटान करने का कोई उचित तरीका है जिसे मैंने याद किया है? - या आग लगने का कोई और तरीका है & टीपीएल के साथ कार्यों को भूल जाते हैं?
संबंधित: (http://stackoverflow.com/q/2630488/119738) (देखें [जवाब] (http://stackoverflow.com/questions/ [करने के लिए आग और भूल जाओ सही तरीका] 2630488 /-सही तरह से करने के लिए आग और भूल-एक-अतुल्यकालिक-प्रतिनिधि/2630510 # 2630510)) –