मैं बैकग्राउंड थ्रेड पर चलने के लिए एक कार्य को ट्रिगर करना चाहता हूं। मैं कार्यों के पूरा होने पर इंतजार नहीं करना चाहता।
3.5 .net में मैंने ऐसा किया होगा:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
.Net 4 में TPL सुझाया गया तरीका है। मैंने जो सामान्य पैटर्न देखा है वह अनुशंसित है:
Task.Factory.StartNew(() => { DoSomething(); });
हालाँकि, StartNew()
विधि एक Task
ऑब्जेक्ट देता है जो लागू करता है IDisposable
। यह उन लोगों द्वारा अनदेखा किया गया लगता है जो इस पैटर्न की सिफारिश करते हैं। Task.Dispose()
विधि पर MSDN प्रलेखन कहता है:
"टास्क के लिए अपना अंतिम संदर्भ जारी करने से पहले हमेशा डिस्पोज़ को कॉल करें।"
जब तक यह पूरा न हो जाए, तब तक आप किसी कार्य को डिस्पोज़ नहीं कर सकते, इसलिए मुख्य थ्रेड प्रतीक्षा और कॉल डिस्पोज़ पहले स्थान पर एक बैकग्राउंड थ्रेड पर करने के बिंदु को पराजित करेगा। वहाँ भी कोई पूर्ण / समाप्त होने वाली घटना नहीं लगती है जिसका उपयोग सफाई के लिए किया जा सकता है।
टास्क क्लास पर MSDN पेज इस पर टिप्पणी नहीं करता है, और "प्रो C # 2010 ..." पुस्तक उसी पैटर्न की सिफारिश करती है और कार्य निपटान पर कोई टिप्पणी नहीं करती है।
मुझे पता है कि अगर मैं इसे छोड़ देता हूं तो फाइनली इसे अंत में पकड़ लिया जाएगा, लेकिन क्या यह वापस आने वाला है और मुझे काटता है जब मैं बहुत आग लगा रहा हूं और इस तरह के कार्यों को भूल जाता हूं और फाइनल थ्रेड अभिभूत हो जाता है?
तो मेरे सवाल हैं:
- यह फोन नहीं करने के लिए स्वीकार्य है
Dispose()
परTask
इस मामले में वर्ग? और यदि हां, तो इसके जोखिम / परिणाम क्यों हैं? - क्या कोई दस्तावेज है जो इस पर चर्चा करता है?
- या क्या उस
Task
वस्तु का निपटान करने का एक उपयुक्त तरीका है जिसे मैंने याद किया है? - या क्या TPL के साथ आग लगाने और कार्यों को भूलने का एक और तरीका है?