2011-07-06 8 views
5

पृष्ठभूमि कार्यकर्ता से पास किए गए डेटा का क्या होता है?पृष्ठभूमि कार्यकर्ता से पास किए गए डेटा का क्या होता है?

डाटा पृष्ठभूमि कार्यकर्ता को मुख्य थ्रेड से RunWorkerAsync का उपयोग कर पारित कर दिया है:

backgroundWorker.RunWorkerAsync(myData); 

इस पृष्ठभूमि सूत्र में DoWork ईवेंट हैंडलर में प्राप्त होता है:

myData = (Data)e.Argument; 

DoWork संसाधित होने के बाद डेटा, यह e.Result का उपयोग कर देता है:

e.Result = myData; 

यह प्राप्त होता है मुख्य थ्रेड में RunWorkerCompleted ईवेंट हैंडलर:

myData = (Data)e.Result; 

BackgroundWorker धागे के बीच डेटा गुजर की देखभाल कर रही है। मैं पृष्ठभूमि कार्यकर्ता से और उससे बड़ी मात्रा में डेटा पास करने की उम्मीद कर रहा हूं, इसलिए मैं जानना चाहता हूं कि इस स्थानांतरण का ओवरहेड क्या है, और यदि पृष्ठभूमि कार्यकर्ता में बड़ी मात्रा में इन-मेमोरी ऑब्जेक्ट्स को प्रोसेस करने का बेहतर तरीका है। मैं यह भी जानना चाहूंगा कि पृष्ठभूमि थ्रेड में डेटा को थ्रेड-सुरक्षित तरीके से मुख्य थ्रेड से एक्सेस करना संभव है।

संदर्भ के लिए, मैं सी #, नेट 3.5 और विंडोज फॉर्म का उपयोग कर रहा हूं।

उत्तर

6

वास्तव में कोई ओवरहेड नहीं है (प्रदत्त Data एक वर्ग है), क्योंकि केवल संदर्भ पास हो गया है। डेटा को धागे में "कॉपी" नहीं किया जाता है - सभी धागे प्रक्रिया में डेटा (अधिकांश भाग के लिए) तक पहुंच सकते हैं।

मैं यह भी जानना चाहूंगा कि पृष्ठभूमि थ्रेड में डेटा थ्रेड से डेटा को थ्रेड-सुरक्षित तरीके से एक्सेस करना संभव है।

हां, डेटा तक पहुंचना संभव है, लेकिन इसे थ्रेड-सुरक्षित तरीके से करने के लिए, आपको सिंक्रनाइज़ेशन को स्वयं प्रबंधित करना होगा। इसे आम तौर पर lock की तरह कुछ की आवश्यकता होती है, हालांकि आप जो कुछ करने की कोशिश कर रहे हैं उसके आधार पर कई विकल्प हैं।

+0

+1। –

5

ऑब्जेक्ट्स हमेशा संदर्भ द्वारा पारित किए गए हैं। कोई ओवरहेड नहीं है।

BackgroundWorker बस ऑब्जेक्ट को एक आंतरिक कतार में जोड़ता है, फिर इसे यूआई थ्रेड पर कतार से पढ़ता है। (यह वास्तव में Control.MarshaledInvoke द्वारा किया जाता है)

+0

+1 - सिवाय इसके कि * हमेशा * सत्य है यदि डेटा एक वर्ग है .... –

+0

@Reed: उन्होंने कहा 'ऑब्जेक्ट', जो मूल्य प्रकारों के लिए मुक्केबाजी का तात्पर्य है। लेकिन जवाब का शब्द संदिग्ध है। प्रश्न के बहु-थ्रेड सिंकिंग भाग का जवाब देने के लिए –

1

स्थानांतरण में अनिवार्य रूप से कोई ओवरहेड नहीं है; यह सिर्फ एक ऑब्जेक्ट संदर्भ है (इसमें शामिल डेटा का कोई प्रकार का मार्शल नहीं है)। जब तक मुख्य धागा RunWorkerAsync और RunWorker को कॉल के बीच डेटा तक नहीं पहुंचता तब तक आप थ्रेड सुरक्षित होते हैं।

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