ฉันต้องการทริกเกอร์งานให้ทำงานบนเธรดพื้นหลัง ฉันไม่อยากรอให้งานเสร็จ
ใน. net 3.5 ฉันจะทำสิ่งนี้:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
ใน. net 4 TPL เป็นวิธีที่แนะนำ รูปแบบทั่วไปที่ฉันเห็นแนะนำคือ:
Task.Factory.StartNew(() => { DoSomething(); });
อย่างไรก็ตามStartNew()
วิธีการส่งกลับวัตถุซึ่งการดำเนินการTask
IDisposable
ดูเหมือนว่าคนที่แนะนำลายนี้จะมองข้ามไป เอกสาร MSDN เกี่ยวกับTask.Dispose()
วิธีการกล่าวว่า:
"โทรหา Dispose ทุกครั้งก่อนที่คุณจะปล่อยการอ้างอิงล่าสุดของคุณไปที่งาน"
คุณไม่สามารถเรียกทิ้งในงานได้จนกว่าจะเสร็จสิ้นดังนั้นการรอเธรดหลักและเรียกใช้การกำจัดจะทำให้จุดที่ต้องทำบนเธรดพื้นหลังตั้งแต่แรก ดูเหมือนว่าจะไม่มีเหตุการณ์ที่เสร็จสมบูรณ์ / เสร็จสิ้นที่สามารถใช้ในการล้างข้อมูลได้
หน้า MSDN ในคลาสงานไม่แสดงความคิดเห็นเกี่ยวกับเรื่องนี้และหนังสือ "Pro C # 2010 ... " แนะนำรูปแบบเดียวกันและไม่แสดงความคิดเห็นเกี่ยวกับการกำจัดงาน
ฉันรู้ว่าถ้าฉันปล่อยทิ้งไว้โปรแกรมสุดท้ายจะจับมันได้ในที่สุด แต่นี่จะกลับมากัดฉันเมื่อฉันทำงานหนักและลืมงานแบบนี้และเธรด Finalizer ท่วมท้นหรือไม่?
ดังนั้นคำถามของฉันคือ:
- ก็เป็นที่ยอมรับที่จะไม่เรียก
Dispose()
ในTask
ระดับในกรณีนี้หรือไม่? และถ้าเป็นเช่นนั้นทำไมและมีความเสี่ยง / ผลกระทบหรือไม่? - มีเอกสารที่กล่าวถึงเรื่องนี้หรือไม่?
- หรือมีวิธีกำจัด
Task
วัตถุที่ฉันพลาดไปอย่างเหมาะสมหรือไม่? - หรือมีวิธีอื่นในการดับเพลิงและลืมงานด้วย TPL หรือไม่?