ฉันแค่สงสัยว่าคลาส Task ใหม่ใน dot.net 4 กำลังสร้างพื้นหลังหรือเธรดเบื้องหน้า?
โดยปกติฉันจะตั้งค่า "IsBackground" บนเธรด แต่ไม่มีแอตทริบิวต์ดังกล่าวในงาน
ฉันไม่พบเอกสารใด ๆ เกี่ยวกับเรื่องนี้ใน MSDN :-(
ฉันแค่สงสัยว่าคลาส Task ใหม่ใน dot.net 4 กำลังสร้างพื้นหลังหรือเธรดเบื้องหน้า?
โดยปกติฉันจะตั้งค่า "IsBackground" บนเธรด แต่ไม่มีแอตทริบิวต์ดังกล่าวในงาน
ฉันไม่พบเอกสารใด ๆ เกี่ยวกับเรื่องนี้ใน MSDN :-(
คำตอบ:
ไม่ควรยากที่จะตรวจสอบ:
class Program
{
static void Main()
{
Task
.Factory
.StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
.Wait();
}
}
และคำตอบคือ ...
ǝnɹʇ
หากคุณกำลังเริ่มTask<T>
ใช้Task.Run()
งานใช่
หากคุณกำลังใช้async
และawait
ไม่มี ตัดตอนมาจากที่นี่ :
"คีย์เวิร์ด async และ await ไม่ทำให้ต้องสร้างเธรดเพิ่มเติมเมธอด Async ไม่จำเป็นต้องใช้มัลติเธรดเนื่องจากเมธอด async ไม่ได้รันบนเธรดของตัวเองเมธอดจะทำงานบนบริบทการซิงโครไนซ์ปัจจุบันและใช้เวลาบนเธรด เฉพาะเมื่อเมธอดใช้งานได้คุณสามารถใช้ Task.Run เพื่อย้ายงานที่ผูกกับ CPU ไปยังเธรดพื้นหลัง แต่เธรดพื้นหลังไม่ได้ช่วยในกระบวนการที่รอให้ผลลัพธ์พร้อมใช้งาน "
งานถูกดำเนินการโดยเธรดที่มาจากเธรดพูลของระบบ เธรดที่มาจากเธรดพูลจะดำเนินการในพื้นหลังตามค่าเริ่มต้น
หากคุณยังไม่มั่นใจในงานเบื้องหลังให้ลองเข้าถึงองค์ประกอบ GUI จากภายในงานเช่น:
public async Task<int> ProcessStuff_Async()
{
while(true)
{
label1.Text = "processing next item";
เพื่อรับข้อยกเว้นเวลาทำงาน:
การดำเนินการข้ามเธรดไม่ถูกต้อง: ควบคุม 'label1' ที่เข้าถึงได้จากเธรดอื่นที่ไม่ใช่เธรดที่ถูกสร้างขึ้น
เช่นเดียวกับเธรดพื้นหลังปกติเก่าที่ดี
มีข้อมูลในเอกสาร MSDN (ณ ปี 2017 :-) เช่น:
วิธีที่ดีที่สุดในการจัดการสิ่งนี้ ... คือการเริ่มเธรดพื้นหลัง ซึ่งทำงานโดยใช้Task.Runและรอผลลัพธ์ วิธีนี้จะช่วยให้ UI รู้สึกราบรื่นขณะทำงาน
What happens under the covers
เอกสารนี้ยังมีส่วนที่