2010-05-06 34 views
37

Nếu tôi có khối mã sau đây trong một phương pháp (sử dụng .NET 4 và Thư viện Parallel Task):Các cá thể .NET Task có thể nằm ngoài phạm vi trong khi chạy không?

var task = new Task(() => DoSomethingLongRunning()); 
task.Start(); 

và trở về phương pháp, nhiệm vụ đó sẽ đi ra khỏi phạm vi và được thu gom rác, hoặc nó sẽ chạy để hoàn thành? Tôi đã không nhận thấy bất kỳ vấn đề với GCing, nhưng muốn chắc chắn rằng tôi không thiết lập bản thân mình cho một điều kiện chủng tộc với GC.

+0

Tôi đã tìm thấy một điều nhỏ về điều này sau một thời gian và tôi nghĩ rằng tôi muốn chia sẻ với bạn, vì lợi ích đầy đủ ... Xem cập nhật bên dưới. –

Trả lời

30

Cập nhật:

Sau khi tôi đã trả lời câu hỏi này (! Lâu lắm rồi) tôi phát hiện ra rằng đó là không đúng sự thật rằng Nhiệm vụ sẽ luôn chạy đến hết - có một nhỏ, chúng ta hãy nói "góc" trường hợp, nơi công việc có thể không hoàn thành.

Lý do cho điều này là: Như tôi đã trả lời trước đây, Nhiệm vụ chủ yếu là chủ đề; nhưng họ là chủ đề nền. Các chủ đề nền được tự động hủy bỏ khi tất cả các chủ đề nền trước kết thúc. Vì vậy, nếu bạn không làm bất cứ điều gì với nhiệm vụ và chương trình kết thúc, có một cơ hội nhiệm vụ sẽ không hoàn thành.

Bạn phải luôn chờ đợi công việc. Bạn có thể tìm thêm thông tin trên excellent answer Jon gave me.


gốc:

công tác dự kiến ​​sẽ ThreadPool, có nghĩa rằng họ là chủ yếu threads¹ (trên thực tế, họ đóng gói đề).

Từ Thread documentation:

Nó không phải là cần thiết để giữ một tham chiếu đến một đối tượng Chủ đề khi bạn đã bắt đầu thread. Các chủ đề tiếp tục thực hiện cho đến khi các thủ tục thread hoàn tất.

Vì vậy, không, không cần giữ lại tham chiếu đến nó.

Ngoài ra, documentation khẳng định rằng cách ưa thích để tạo ra một nhiệm vụ là để sử dụng nó của nhà máy:

Bạn cũng có thể sử dụng phương pháp StartNew để tạo ra và bắt đầu một nhiệm vụ trong một hoạt động. Đây là cách ưa thích để tạo ra và bắt đầu nhiệm vụ nếu tạo và lập kế hoạch không phải là tách ra (...)

Hy vọng nó giúp.


¹ Theo đó đến documentation:

Một nhiệm vụ đại diện cho một hoạt động không đồng bộ, và trong một số cách nó giống việc tạo ra một chủ đề hoặc ThreadPool hạng mục công trình mới, nhưng ở một mức trừu tượng cao hơn.

11

Nhiệm vụ sẽ chạy để hoàn thành. Ngay cả khi không có bất kỳ tham chiếu nào khác (không bắt nguồn từ tôi tin là thuật ngữ), nhóm chủ đề vẫn sẽ giữ một tham chiếu đến nó, và ngăn chặn nó khỏi bị thu gom rác ít nhất (tôi nói ít nhất, bởi vì ngay cả sau khi nó hoàn thành, không có gì đảm bảo rằng nó sẽ là Garbage Collected) cho đến khi hoàn thành.

+0

Có, 'bắt nguồn từ 'là cụm từ chính xác. Miễn là * cái gì đó * có một tham chiếu hợp lệ (trực tiếp) đối với cá thể tác vụ, nó sẽ không đủ điều kiện để thu thập. Trong trường hợp này, chính hồ bơi luồng sẽ giữ tham chiếu đó cho đến khi luồng hoàn tất. –

+5

Để chính xác hơn, bộ lập lịch tác vụ của TPL sẽ có tham chiếu đến tác vụ trong khi nó đang chạy. Nếu không có tham chiếu đó, nhiệm vụ có thể là rác được thu thập, nhưng điều đó sẽ không dừng mã chạy từ kết thúc. – Steven

Các vấn đề liên quan