BackgroundWorker vs. Async / Await


16

ฉันยังใหม่กับการพัฒนา C # และต้องการสร้าง UI ที่ตอบสนองได้ดีขึ้น ในการวิจัยเบื้องต้นของฉันฉันเห็นสองวิธีในการบรรลุเป้าหมายนี้:

  1. มัลติเธรดร่วมกับคลาส BackgroundWorker
  2. ตัวดัดแปลง Async / Await ที่ใหม่กว่า

ใหม่กว่าหมายความว่าดีกว่า ความแตกต่างระหว่างสองวิธีคืออะไร หากฉันต้องการสร้างโครงการใหม่ฉันจะเลือกวิธีที่จะไปด้วยได้อย่างไร

แก้ไข: บางทีฉันควรระบุ ฉันกำลังสร้างแอปพลิเคชัน Windows Forms ซึ่งข้อมูลที่จำเป็นทั้งหมดจะถูกบันทึก / โหลดบนดิสก์ภายในเครื่อง ฉันจะสื่อสารกับอุปกรณ์ USB หลายแห่งด้วย


คำตอบ:


10

BackgroundWorkerคุณจะสามารถที่จะบรรลุผลงานของคุณโดยใช้ เป็นคลาสที่รู้จักกันดีและหลายคนใช้มัน

โดยทั่วไปแล้วC # 5 asyncและawaitคำหลักจะช่วยให้การเขียนโค้ดอะซิงโครนัสอ่านง่ายขึ้น อาจมีบทเรียนและตัวอย่างของวิธีการทำงานต่าง ๆ ด้วยคำหลักเหล่านี้น้อยBackgroundWorkerลง

ยกเว้นกรณีที่คุณจำเป็นต้องใช้รุ่นเก่าของ C # ผมขอแนะนำให้เรียนรู้วิธีการใช้งานและasyncawait


13

asyncและawaitคำหลักที่จะไม่ทำให้ใบสมัครของคุณตอบสนองมากขึ้นได้ด้วยตัวเอง พวกเขาเพียงแค่ทำการโทรและจัดการกับวิธีการที่ทำให้Taskวัตถุกลับมามีความสะดวกมากขึ้น ในการสร้างasync/ awaitใช้เธรดพื้นหลังจริง ๆ คุณจะต้องรวมกับการใช้สิ่งต่าง ๆ เช่น:

  • Task.Start()- TaskSchedulerเริ่มต้นเป็นงานที่ได้รับใช้
  • PLINQ - ดำเนินการชุดของการดำเนินการแบบขนานส่งคืนงาน
  • TaskCompletionSource- วิธีการที่กำหนดเองเพื่อจัดการงาน async ที่เดียวที่ฉันใช้นี่คือจัดการกับเหตุการณ์ที่เกิดขึ้นจากการWebBrowserควบคุม
  • asyncวิธีการอื่นเช่นฟังก์ชั่นมากมายใน Win 8 API

กล่าวอีกนัยหนึ่งasync/ awaitเป็นส่วนขยายของรูปแบบอะซิงโครนัสตามงาน คุณสามารถหาพื้นที่ขนาดใหญ่ของข้อมูลรวมถึงตัวอย่างมากมายที่นี่

BackgroundWorkerเป็นองค์ประกอบ WinForms ที่สร้างด้ายพื้นหลัง 1 โดยใช้รูปแบบการจัดกิจกรรมตาม Asynchronousและคุณสามารถเติมงานที่ทำในหัวข้อพื้นหลังนี้ด้วยรหัสของคุณเองในDoWorkตัวจัดการเหตุการณ์ โดยทั่วไปแล้วMicrosoft ไม่แนะนำให้ใช้รูปแบบนี้อีกต่อไป (ดูที่ด้านล่างของหน้าเว็บที่นี่ ) แม้ว่าคุณจะคุ้นเคยกับมันแล้ว แต่ก็อาจเป็นตัวเลือกที่ง่าย

อีกตัวเลือกหนึ่งไม่ได้กล่าวถึงเป็นปฏิกิริยาส่วนขยายสำหรับ NET นี่เป็นอีกหนึ่งกรอบการทำงานที่ยอดเยี่ยมสำหรับการเพิ่มการตอบสนองต่อแอพของคุณ


เมื่อคุณพูดว่า Win 8 API นั่นหมายความว่าคุณลักษณะ Async ไม่ได้รับการสนับสนุนอย่างดีบน Windows 7 (แพลตฟอร์มเป้าหมายของฉัน) หรือไม่?
robert.ecot

1
สวัสดี Robert, Win 8 .NET API (สำหรับแอพ "Metro" - style) ใช้ async และรอคอยอย่างหนักสำหรับทุกอย่างตั้งแต่ File I / O ไปจนถึงการแสดงกล่องโต้ตอบ ในคอมโพเนนต์. NET อื่น ๆ ตัวอย่างเช่น FileStream คุณยังสามารถใช้ async / await กับวิธีต่างๆเช่น Stream.ReadAsync ดังนั้นจึงมีการสนับสนุนนอก Win 8 ด้วย
Kevin McCormick

เยี่ยมมากและขอบคุณสำหรับลิงก์ที่อัปเดตด้วยเช่นกัน! มีประโยชน์มาก
robert.ecot

1
ฉันไม่เห็นสิ่งใดในหน้านั้นที่ระบุว่าBackgroundWorkerแนะนำโดยเฉพาะ
Kyralessa

ฉันยังแนะนำให้อ่านAsync VS BackgroundWorkerและชุดบทความบล็อกเกี่ยวกับการเขียนโปรแกรมพร้อมกันใน C #ของ Stephen Clearly ผู้แต่งหนังสือ omonymous ที่ตีพิมพ์โดย O'Reilly
sentenza

3

ผมบอกว่าasync- มีความยืดหยุ่นมากขึ้นกว่าawait BackgroundWorkerและถ้าคุณต้องการที่จะทำบางสิ่งบางอย่างที่เหมาะกับBackgroundWorkerคุณสามารถทำมันได้ด้วยasync- awaitเกินไปกับการอ่านมากขึ้นและรหัสชนิดปลอดภัยมากขึ้น

เพราะการที่ฉันคิดว่าคุณควรจะเลือกใช้async- เหนือawaitBackgroundWorker

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.