ฉันคิดว่ามันเหมือนกัน - เขียนโปรแกรมที่แบ่งงานระหว่างโปรเซสเซอร์ (บนเครื่องที่มีโปรเซสเซอร์ 2+) จากนั้นฉันก็อ่านสิ่งนี้ซึ่งพูดว่า:
วิธีการแบบอะซิงก์มีจุดประสงค์เพื่อให้ไม่มีการบล็อก นิพจน์ที่รออยู่ในเมธอด async จะไม่บล็อกเธรดปัจจุบันในขณะที่งานที่รออยู่กำลังทำงานอยู่ แต่นิพจน์จะลงทะเบียนส่วนที่เหลือของวิธีเป็นการต่อเนื่องและส่งกลับการควบคุมไปยังผู้โทรของวิธีการแบบอะซิงก์
คำหลักแบบ async และ waitit จะไม่ทำให้เกิดการสร้างเธรดเพิ่มเติม เมธอด Async ไม่ต้องการมัลติเธรดเนื่องจากเมธอด async ไม่ทำงานบนเธรดของตัวเอง วิธีการทำงานกับบริบทการซิงโครไนซ์ปัจจุบันและใช้เวลาในเธรดเฉพาะเมื่อวิธีการใช้งานอยู่ คุณสามารถใช้ Task.Run เพื่อย้ายงานที่เชื่อมโยงกับ CPU ไปยังเธรดพื้นหลังได้ แต่เธรดพื้นหลังไม่ได้ช่วยกระบวนการที่รอให้ผลลัพธ์พร้อมใช้งาน
และฉันสงสัยว่ามีคนสามารถแปลเป็นภาษาอังกฤษให้ฉันได้หรือไม่ ดูเหมือนว่าจะแยกความแตกต่างระหว่าง asyncronicity (นั่นคือคำ?) และการทำเกลียวและบอกเป็นนัยว่าคุณสามารถมีโปรแกรมที่มีงานแบบอะซิงโครนัส แต่ไม่มีมัลติเธรด
ตอนนี้ฉันเข้าใจความคิดของงานอะซิงโครนัสเช่นตัวอย่างใน pg 467 ของC #ของ Jon Skeet ในความลึก, รุ่นที่สาม
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
async
หมายถึงคำว่า " ฟังก์ชั่นนี้เมื่อใดก็ตามที่เรียกว่าจะไม่ถูกเรียกในบริบทที่เสร็จสมบูรณ์เป็นสิ่งจำเป็นสำหรับทุกอย่างหลังจากเรียกจะเรียกว่า."
กล่าวอีกนัยหนึ่งเขียนไว้ตรงกลางงาน
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
เนื่องจากDisplayWebsiteLength()
ไม่มีส่วนเกี่ยวข้องกับx
หรือy
จะทำให้DisplayWebsiteLength()
ถูกดำเนินการ "ในพื้นหลัง" เช่น
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
เห็นได้ชัดว่าเป็นตัวอย่างที่โง่ แต่ฉันถูกต้องหรือฉันสับสนทั้งหมดหรืออะไร
(นอกจากนี้ฉันสับสนเกี่ยวกับสาเหตุsender
และe
ไม่เคยใช้ในเนื้อหาของฟังก์ชั่นด้านบน)
sender
และe
แนะนำว่านี่คือตัวจัดการเหตุการณ์จริงๆแล้วเป็นสถานที่เดียวที่async void
เป็นที่ต้องการ ส่วนใหญ่แล้วสิ่งนี้จะถูกเรียกเมื่อคลิกปุ่มหรืออะไรทำนองนั้น - ผลลัพธ์คือการกระทำนี้เกิดขึ้นอย่างสมบูรณ์แบบอะซิงโครนัสกับส่วนที่เหลือของแอปพลิเคชัน แต่มันยังคงอยู่ในหนึ่งเธรด - เธรด UI (ด้วยเวลาเล็กน้อยในเธรด IOCP ที่โพสต์การเรียกกลับไปยังเธรด UI)
DisplayWebsiteLength
ตัวอย่างรหัส: คุณไม่ควรใช้HttpClient
ในusing
คำสั่ง - ภายใต้การโหลดจำนวนมากรหัสสามารถใช้จำนวนซ็อกเก็ตที่มีอยู่หมดซึ่งส่งผลให้เกิดข้อผิดพลาด SocketException ข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มที่ไม่เหมาะสม