2009-02-18 3 views
10

क्या पृष्ठभूमि कार्यकर्ताओं का पुन: उपयोग किया जाता है?पृष्ठभूमि कार्यकर्ताओं के आविष्कार के बीच थ्रेड-स्थानीय भंडारण जारी है?

विशेष रूप से, यदि मैं पृष्ठभूमि कार्यकर्ता की DoWork() विधि के दौरान नामित डेटा स्लॉट (थ्रेड-लोकल स्टोरेज) सेट करता हूं, तो उस डेटा स्लॉट का मान जारी रहेगा, संभावित रूप से बाद में कुछ अन्य धागे पाए जाएंगे ?

मुझे ऐसा लगा नहीं होता है, लेकिन मैं इस बग है ...

संपादित करें: This blog post पता चलता है कि BackGroundWorker एक ThreadPool जिसका मतलब है कि धागे फिर से उपयोग किया जाता है का इस्तेमाल करता है,। तो सवाल बन जाता है; पुन: प्रयुक्त धागे संभावित रूप से इनवोकेशन के बीच धागे-स्थानीय भंडारण को जारी रखते हैं?

उत्तर

7

जब थ्रेड पूल एक धागा पुनः उपयोग कर लेता है, यह धागा स्थानीय भंडारण में या खेतों कि ThreadStaticAttribute विशेषता के साथ चिह्नित हैं में डेटा साफ़ नहीं है। इसलिए, एक विधि द्वारा थ्रेड स्थानीय भंडारण में रखा गया डेटा उसी थ्रेड पूल थ्रेड द्वारा निष्पादित किसी भी अन्य विधि से अवगत कराया जा सकता है। एक विधि जो थ्रेडस्टैटिक एट्रिब्यूट विशेषता के साथ चिह्नित फ़ील्ड तक पहुंचती है, उस थ्रेड पूल थ्रेड को निष्पादित करने के आधार पर अलग-अलग डेटा का सामना कर सकती है।

स्रोत: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

0

यह निर्धारित करने के लिए स्रोत (या प्रतिबिंबक के माध्यम से) को जांचने की आवश्यकता होगी यदि यह एमएसडीएन में निर्दिष्ट नहीं है।

यदि यह निर्दिष्ट नहीं है तो आप वर्तमान व्यवहार पर भरोसा नहीं कर सकते हैं जो .NET के भविष्य के संस्करण में नहीं बदल रहा है।

संपादित करें: ऐसा लगता है कि यह थ्रेड पूल का उपयोग कर रहा है, इसलिए धागे पुन: उपयोग किए जाएंगे।

4

ठीक है, आंतरिक रूप से BackgroundWorkerBeginInvoke उपयोग कर रहा है, जिसका अर्थ है (मैं मानना ​​है ) है कि यह ThreadPool से धागे से एक का उपयोग कर रहा है। अगर टीएलएस पूल में लौटाए जाने पर टीएलएस साफ़ हो जाता है, तो मैं निश्चित रूप से कुछ नहीं कह सकता।

संपादन के जवाब में, मैंने प्रतिबिंब में कुछ भी नहीं देखा है जो सुझाव देता है कि टीएलएस स्लॉट पूल में लौटने के बाद साफ़ या मुक्त हो जाते हैं। तो आपको अपने DoWork विधि रिटर्न से पहले उन्हें स्पष्ट रूप से साफ़ करना होगा।

+2

टीएलएस में अवरोध है जब थ्रेड पूल "धागा स्थानीय भंडारण में या में डेटा जब थ्रेड पूल एक धागा पुनः उपयोग कर लेता, यह स्पष्ट नहीं है थ्रेड रिटर्न फ़ील्ड ThreadStaticAttribute विशेषता के साथ चिह्नित कर रहे हैं। इसलिए, जब एक विधि स्थानीय भंडारण या क्षेत्रों कि ThreadStaticAttribute विशेषता के साथ चिह्नित हैं थ्रेड की जांच करता है, मूल्यों यह पाता थ्रेड पूल धागा के पहले के एक प्रयोग से बचे हो सकता है। " 'स्रोत: [लिंक] (http://msdn.microsoft.com/enus/library/system.threading.threadpool.aspx)' – Taher

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