2012-01-30 27 views
10

Tôi đang nghiên cứu việc sử dụng Thư viện song song nhiệm vụ cho một dự án làm việc tôi đang làm và muốn hiểu những ưu điểm/nhược điểm của các tác vụ chạy dài. Tôi chưa có một ví dụ thực tế, chỉ muốn hiểu lý thuyết đằng sau điều này.Task Parallel Library - Nhiệm vụ LongRunning vs Nhiều Continuations

Từ những trang MSDN nói về task schedulers và điều này SO question, có vẻ như tốt nhất là tránh các tác vụ lâu dài càng nhiều càng tốt để bạn không tạo chủ đề bên ngoài ThreadPool. Nhưng nói rằng bạn đã có một nhiệm vụ được sẽ mất một thời gian dài để hoàn thành, thay vì điều này:

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning) 

Bạn có thể thử và chia tay công việc của bạn thành nhỏ hơn, đơn vị nhanh hơn công việc và sử dụng continuations nhiệm vụ, như này:

Task.Factory 
    .StartNew(() => DoWorkPart1()) 
    .ContinueWith(t => DoWorkPart2()) 
    .ContinueWith(t => DoWorkPart3()) 
    //...etc 

Phương pháp này có mang lại lợi ích hơn hoặc quá mức cho những gì nó đang cố gắng đạt được không?

+0

Nó thực sự phụ thuộc vào ý của bạn * dài *. –

Trả lời

5

nó sẽ có vẻ như thể nó là tốt nhất để tránh các nhiệm vụ dài hạn càng nhiều càng tốt

Không hoàn toàn chính xác. Nếu bạn cần nó sau đó bạn sẽ phải thực hiện/phân bổ một thread bằng cách nào đó và sau đó nhiệm vụ với tùy chọn LongRunning có lẽ là sự lựa chọn tốt nhất. Lá cờ chỉ đơn giản là thông báo cho các Scheduler Task có thể mất một thời gian để các Scheduler có thể dự đoán. Nó thậm chí có thể bỏ qua tùy chọn.

Bạn có thể thử và chia tay công việc của bạn thành các đơn vị nhỏ hơn, nhanh hơn công việc một

Nếu bạn có thể, sau đó làm điều đó. Nhưng không phải al taks dễ bị tách ra.

+0

Tôi đồng ý rằng không phải tất cả các thuật toán đều có thể chia nhỏ dễ dàng thành các phần nhỏ hơn. Nhưng nếu bạn có thể, nó sẽ là tốt hơn để làm như vậy? Tôi đoán rằng nó sẽ sử dụng TPL tốt hơn so với lịch trình tạo một thread khác, tôi có đúng không? –

+0

Nó có thể tốt hơn, nhưng điều đó không chắc chắn. Tôi thường không bận tâm quá nhiều. Bạn không (không thể) biết nếu nó dẫn đến một chuỗi phụ. –

3

Khi bạn chỉ định TaskCreationOptions.LongRunning chủ yếu là nó gán một chuỗi chuyên dụng từ bên ngoài nhóm chủ đề.

tôi sẽ đề nghị đơn giản đi cho lớp BackgroundWorker mà làm cho chắc chắn nhiệm vụ của bạn chạy dài sẽ được chạy trên một sợi chuyên dụng riêng biệt thay vì một sợi từ bể thread

+1

TaskCreationOptions.LongRunning cũng thường gây ra một chuỗi chuyên dụng được tạo ra. – dtb

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