2010-03-22 15 views
6

क्या वेब ब्राउज़र नियंत्रण के साथ पृष्ठभूमि कार्यकर्ता धागे का उपयोग करने के लिए यह संभव/अनुशंसित है?पृष्ठभूमिवर्कर और वेब ब्रोसर नियंत्रण

मैं एक बॉट बना रहा हूं जो खोजशब्दों के लिए Google की खोज करता है, फिर पहले 10 पृष्ठों में साइटों के लिए जांच करता है कि साइट को रैंक किया गया है या नहीं।

उपयोगकर्ता चेक करने के लिए अधिकतम 20 साइटें प्रदान कर सकता है, और प्रॉक्सी का उपयोग कर सकता है। तो आदर्श रूप में मैं एक बार में काम कर रहे 5 धागे रखना चाहता हूं।

क्या यह संभव है? मैंने कहीं कहीं सुना होगा कि WebBrowser नियंत्रण और धागे के साथ समस्याएं हैं।

उत्तर

15

यह नहीं है। WebBrowser इंटरनेट एक्सप्लोरर का उपयोग करता है जो एक COM घटक है। COM घटकों में एक थ्रेडिंग मॉडल होता है, आईई "अपार्टमेंट" का उपयोग करता है। जो एक महंगा शब्द है जिसका अर्थ है कि यह थ्रेड-सुरक्षित नहीं है। आपको बीजीडब्ल्यू में अपनी विधियों को कॉल करने की अनुमति है, लेकिन COM स्वचालित रूप से यूआई थ्रेड पर कॉल को मार्शल कर देगा। चूंकि सभी विधि कॉल और संपत्ति एक्सेस वास्तव में UI थ्रेड पर होते हैं, इसलिए आप इसे बीजीडब्लू का उपयोग करके धीमी बना देंगे।

आप वास्तव में किसी अन्य थ्रेड पर WebBrowser चला सकते हैं, तो आपको उस धागे पर इसका एक उदाहरण बनाना होगा। और आपको एक थ्रेड बनाना होगा जो एक तथाकथित सिंगल थ्रेडेड अपार्टमेंट है। एसटीए, एक संक्षिप्त शब्द जो आप Winforms या WPF अनुप्रयोग की मुख्य() विधि पर [STAThread] विशेषता से अच्छी तरह से पहचान सकते हैं। एसटीए में एक कार्यकर्ता थ्रेड को बदलने से आपको इसे शुरू करने से पहले Thread.SetApartmentState() को कॉल करने की आवश्यकता होती है। आप बीजीडब्ल्यू के लिए ऐसा नहीं कर सकते हैं। और थ्रेड को एसटीए अनुबंध को लागू करने के लिए एक संदेश लूप पंप करना होगा, इसे एप्लिकेशन को कॉल करना होगा। रुन()। एक के लिए, वेबब्राउज़र को अपनी घटनाओं को बढ़ाने के लिए आवश्यक है। This answer दृष्टिकोण दिखाता है।

WebRequest क्लास का उपयोग करने पर विचार करें।

+3

+1! –

+2

मैं इस खोज में अपनी खोज में आया था कि क्या यूआई थ्रेड पर 'WebBrowser.Navigate() '** नहीं ** का उपयोग करना संभव है या नहीं। आपके प्रश्न से मेरी समझ है कि हाँ, यह संभव है लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि ऐसी सभी कॉल यूआई थ्रेड पर किसी भी तरह से मार्शल हो जाती हैं। क्या मैं इसे सही ढंग से समझता हूं? –

1

क्या कोई कारण है कि आप लाइब्रेरी पर आईई नियंत्रण का उपयोग कर रहे हैं जैसे कि HTML Agility pack? इसने आईई के COM दुःस्वप्न के बिना मल्टीथ्रेडिंग का समर्थन किया है, और एचटीएमएल पार्सिंग के साथ बहुत अधिक शक्तिशाली है।

+2

बॉट कीवर्ड खोज भी करता है और कुछ टूल्स अन्य टूल्स का उपयोग करता है। Google बॉट अनुरोधों पर बहुत सख्त है, इसलिए IE का उपयोग करना HttpWebRequest का उपयोग करने से प्रबंधित करना बहुत आसान है। –

+3

मुझे आश्चर्य है कि क्या उनके पास ब्राउज़र का उपयोग करके बॉट्स की नीति है। –

+0

@ हेनकहोल्टरमैन उनके पास ऐसी किसी भी चीज के खिलाफ नीति है जो उनकी सेवा और मुनाफे को नुकसान पहुंचा सकती है। 'यह नहीं है' के लिए –

1

अपने तत्काल प्रश्न का उत्तर देने के लिए: मैंने कभी कोशिश नहीं की है, लेकिन अगर समस्याएं हैं तो मुझे आश्चर्य नहीं होगा। सामान्य रूप से WinForms नियंत्रण मुख्य UI थ्रेड के अलावा अन्य धागे से एक्सेस करने का इरादा नहीं है। आपको अन्य धागे से चालान विधियों को चलाने के लिए Control.Invoke() विधि का उपयोग करना चाहिए। यह उन्हें मुख्य यूआई थ्रेड पर कतारबद्ध करता है।

व्यापक समस्या का समाधान करने के लिए: यदि आप उपयोगकर्ता को देखने के लिए वास्तव में HTML प्रस्तुत करने की आवश्यकता नहीं है तो संभवतः आप वेबब्रोसर नियंत्रण का उपयोग न करने से बेहतर हैं। आप HttpWebRequest कक्षा का उपयोग कर एक पृष्ठ डाउनलोड कर सकते हैं, जो कि बहुत हल्का है। WebBrowser मूल रूप से आपके एप्लिकेशन में एम्बेडेड इंटरनेट एक्सप्लोरर है।

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