Tôi muốn kích hoạt một tác vụ để chạy trên một chuỗi nền. Tôi không muốn chờ đợi khi hoàn thành nhiệm vụ.
Trong .net 3.5, tôi sẽ làm điều này:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
Trong .net 4, TPL là cách được đề xuất. Mô hình phổ biến mà tôi đã thấy được đề xuất là:
Task.Factory.StartNew(() => { DoSomething(); });
Tuy nhiên, StartNew()
phương thức trả về một Task
đối tượng thực hiện IDisposable
. Điều này dường như bị bỏ qua bởi những người giới thiệu mẫu này. Tài liệu MSDN về Task.Dispose()
phương pháp cho biết:
"Luôn gọi Vứt bỏ trước khi bạn phát hành tham chiếu cuối cùng của mình cho Tác vụ."
Bạn không thể gọi hủy bỏ một nhiệm vụ cho đến khi nó hoàn thành, vì vậy, việc để luồng chính chờ và xử lý lệnh gọi sẽ đánh bại quan điểm của việc thực hiện trên một luồng nền ngay từ đầu. Có vẻ như không có bất kỳ sự kiện đã hoàn thành / kết thúc nào có thể được sử dụng để dọn dẹp.
Trang MSDN trên lớp Tác vụ không bình luận về điều này và cuốn sách "Pro C # 2010 ..." đề xuất mẫu tương tự và không đưa ra bình luận về việc xử lý tác vụ.
Tôi biết nếu tôi cứ để nó thì cuối cùng thì trình hoàn thiện sẽ bắt được nó, nhưng liệu điều này có quay lại và cắn tôi khi tôi đang thực hiện rất nhiều nhiệm vụ và quên như thế này và chuỗi trình hoàn thiện bị quá tải không?
Vì vậy, câu hỏi của tôi là:
- Không gọi
Dispose()
vàoTask
lớp trong trường hợp này có được chấp nhận không ? Và nếu có, tại sao và có rủi ro / hậu quả không? - Có tài liệu nào thảo luận về điều này không?
- Hay có cách nào thích hợp để vứt bỏ
Task
đối tượng mà tôi đã bỏ sót? - Hay có một cách khác để thực hiện nhiệm vụ cứu hỏa và quên với TPL?