งานถูกสร้างเป็นเธรดพื้นหลังหรือไม่


86

ฉันแค่สงสัยว่าคลาส Task ใหม่ใน dot.net 4 กำลังสร้างพื้นหลังหรือเธรดเบื้องหน้า?

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

ฉันไม่พบเอกสารใด ๆ เกี่ยวกับเรื่องนี้ใน MSDN :-(

คำตอบ:


120

ไม่ควรยากที่จะตรวจสอบ:

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}

และคำตอบคือ ...

ǝnɹʇ


ฉันมีปัญหาที่งานทั้งหมดของฉันกำลังทำงานบนเธรดการโทร ฉันวางบรรทัดของรหัสที่แน่นอนด้านบนลงในโครงการของฉันและรายงานว่า "เท็จ" คุณรู้ไหมว่าทำไมถึงเป็นเช่นนั้น? ฉันใช้. NET 4.0
Trevor Elliott

8
ตามกระทู้นี้ stackoverflow.com/questions/7889746/…คุณไม่รับประกันเธรดพื้นหลังเมื่อเริ่มงาน แต่คุณควรจะเป็นถ้าคุณใช้ TaskCreationOptions.LongRunning ฉันใช้ตัวเลือกนั้นและยังไม่ได้สร้างเธรดพื้นหลัง สิ่งที่ช่วยให้?
Trevor Elliott

สามารถกำหนดค่าไม่ให้?
Royi Namir

2
ฉันเชื่อว่าปัญหาของ Moozhe อาจเกิดจากบริบทการซิงโครไนซ์เริ่มต้น ลักษณะการทำงานอาจแตกต่างกันไปขึ้นอยู่กับว่าคุณอยู่ในแอปพลิเคชัน WinForms, WPF, Web หรือ Console เนื่องจากทั้งหมดมีวิธีเริ่มต้นที่แตกต่างกันในการจัดกำหนดการงานพร้อมกัน
jpierson

5
รักคำตอบของคุณ: "ǝnɹʇ" สนุกมาก ขอขอบคุณ.
teddy

12

หากคุณกำลังเริ่มTask<T>ใช้Task.Run()งานใช่

หากคุณกำลังใช้asyncและawaitไม่มี ตัดตอนมาจากที่นี่ :

"คีย์เวิร์ด async และ await ไม่ทำให้ต้องสร้างเธรดเพิ่มเติมเมธอด Async ไม่จำเป็นต้องใช้มัลติเธรดเนื่องจากเมธอด async ไม่ได้รันบนเธรดของตัวเองเมธอดจะทำงานบนบริบทการซิงโครไนซ์ปัจจุบันและใช้เวลาบนเธรด เฉพาะเมื่อเมธอดใช้งานได้คุณสามารถใช้ Task.Run เพื่อย้ายงานที่ผูกกับ CPU ไปยังเธรดพื้นหลัง แต่เธรดพื้นหลังไม่ได้ช่วยในกระบวนการที่รอให้ผลลัพธ์พร้อมใช้งาน "


1
เนื่องจากคุณกำลังใช้งานเรียกใช้งานมันจะอยู่บนเธรดพื้นหลัง แต่ถ้ามันโดนรอคอยมันอาจทำอะไรเป็นพิเศษเพื่อหยุดเธรดชั่วคราวและรอผลลัพธ์ ควรค่าแก่การตรวจสอบ
Steztric


0

งานถูกดำเนินการโดยเธรดที่มาจากเธรดพูลของระบบ เธรดที่มาจากเธรดพูลจะดำเนินการในพื้นหลังตามค่าเริ่มต้น


-1

หากคุณยังไม่มั่นใจในงานเบื้องหลังให้ลองเข้าถึงองค์ประกอบ 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เอกสารนี้ยังมีส่วนที่


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