BackgroundWorker बनाम Async / Await


17

मैं C # विकास में नया हूं और एक अधिक उत्तरदायी UI बनाना चाहता हूं। अपने प्रारंभिक शोध में, मैंने इसे प्राप्त करने के दो तरीके देखे हैं:

  1. बैकग्राउंडवॉकर क्लास के साथ मिलकर मल्टी-थ्रेडिंग।
  2. नई Async / Await संशोधक।

क्या नए का मतलब बेहतर है? दोनों विधियों में क्या अंतर है? यदि मैं एक नई परियोजना बनाना चाहता हूं, तो मैं किस विधि को चुनूं?

संपादित करें: शायद मुझे निर्दिष्ट करना चाहिए। मैं एक Windows प्रपत्र एप्लिकेशन बना रहा हूं, जहां सभी आवश्यक डेटा स्थानीय डिस्क पर सहेजे / लोड किए जाएंगे। मैं कई USB उपकरणों के साथ भी संवाद करूंगा।


जवाबों:


10

आप का उपयोग कर अपने कार्य को पूरा करने में सक्षम हो जाएगा BackgroundWorker। यह एक प्रसिद्ध वर्ग है, और कई लोगों ने इसका उपयोग किया है।

नए C # 5 asyncऔर awaitकीवर्ड मूल रूप से पठनीय अतुल्यकालिक कोड लिखना आसान बनाते हैं। इसके बजाय इन कीवर्ड के साथ विभिन्न कार्यों को पूरा करने के लिए कम ट्यूटोरियल और उदाहरण हो सकते हैं BackgroundWorker।

जब तक आपको C # के पुराने संस्करण का उपयोग करने की आवश्यकता न हो, मैं सुझाव देता हूं कि कैसे उपयोग करना है asyncऔर await।


14

asyncऔर awaitकीवर्ड को अपने दम पर अपने आवेदन और अधिक उत्तरदायी नहीं होगा। वे बस उन तरीकों से कॉलिंग और हैंडलिंग करते हैं जो Taskऑब्जेक्ट्स को अधिक सुविधाजनक बनाते हैं । पृष्ठभूमि के धागे बनाने async/ awaitवास्तव में उपयोग करने के लिए , आपको निम्न चीजों के उपयोग के साथ संयोजन करना होगा:

  • Task.Start()- का उपयोग कर दिए गए कार्य को प्रारंभ करता है TaskScheduler।
  • PLINQ - समानांतर में संचालन की एक श्रृंखला निष्पादित करें, एक कार्य देता है।
  • TaskCompletionSource- Async कार्यों को संभालने के लिए एक कस्टम तरीका। एक जगह मैंने इसका इस्तेमाल एक WebBrowserनियंत्रण से आने वाली घटनाओं को संभालने के लिए किया था ।
  • अन्य asyncविधियां, जैसे विन 8 एपीआई में कई कार्य।

दूसरे शब्दों में, async/ awaitका एक विस्तार है कार्य-आधारित अतुल्यकालिक पैटर्न । आप कई नमूनों सहित जानकारी की एक बड़ी मेजबानी पा सकते हैं, यहां ।

BackgroundWorkerएक WinForms घटक है कि 1 पृष्ठभूमि का उपयोग कर धागा बनाता है घटना-आधारित अतुल्यकालिक पैटर्न , और आप काम में अपने खुद के कोड के साथ इस पृष्ठभूमि थ्रेड पर की जाती पॉप्युलेट कर सकती DoWorkईवेंट हैंडलर। सामान्य तौर पर, माइक्रोसॉफ्ट अब इस पद्धति का उपयोग कर की सिफारिश की (पृष्ठ के नीचे देखने के लिए यहाँ ), हालांकि अगर आप इसे से परिचित हैं पहले से ही यह अभी भी एक सरल विकल्प हो सकता है।

एक अन्य विकल्प का उल्लेख नहीं किया गया है, .NET के लिए प्रतिक्रियाशील एक्सटेंशन है । अपने ऐप्स में जवाबदेही जोड़ने के लिए यह एक और बढ़िया ढांचा है।


जब आप विन 8 एपीआई कहते हैं, तो क्या इसका मतलब यह है कि विंडोज 7 (मेरा लक्ष्य प्लेटफॉर्म) पर Async फीचर्स उतनी अच्छी तरह से समर्थित नहीं हैं?
— robert.ecot

1
हाय रॉबर्ट, विन 8 .NET एपीआई ("मेट्रो" -स्टाइल एप्स के लिए) एसिंक्स का उपयोग कर रहा है और फाइल आई / ओ से डायलॉग बॉक्स दिखाने के लिए हर चीज का भारी इंतजार कर रहा है। अन्य .NET घटकों में, उदाहरण के लिए, FileStream, आप Async / Waitit का उपयोग भी कर सकते हैं जैसे कि Stream.ReadAsync। तो विन 8 के बाहर भी कुछ समर्थन है।
— केविन मैककॉर्मिक

महान, और अद्यतन लिंक के लिए भी धन्यवाद! बहुत मददगार।
— robert.ecot

1
मुझे उस पृष्ठ पर कुछ भी दिखाई नहीं दे रहा है जो यह दर्शाता है कि BackgroundWorker, विशेष रूप से, के खिलाफ सिफारिश की गई है।
— Kyralessa

मैं Async VS BackgroundWorker और स्टीफन के C # में समवर्ती प्रोग्रामिंग के बारे में ब्लॉग पोस्टों की श्रृंखला को भी स्पष्ट रूप से पढ़ने की सलाह देता हूं , जो ओ'रेली द्वारा प्रकाशित सर्वनाम पुस्तक के लेखक हैं।
— संतरा

3

मैं कहूँगा कि async- awaitकी तुलना में बहुत अधिक लचीला है BackgroundWorker। और यदि आप कुछ ऐसा करना चाहते हैं जो फिट बैठता है BackgroundWorker, तो आप इसे कर सकते हैं async- awaitबहुत अधिक पठनीय और अधिक प्रकार-सुरक्षित कोड के साथ।

इस कारण से, मुझे लगता है कि आप का उपयोग कर पसंद करते हैं चाहिए async- awaitअधिक BackgroundWorker।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.