2010-06-15 21 views
25

Dường như phương pháp TaskFactory.StartNew trong .NET 4.0 được dự định thay thế cho ThreadPool.QueueUserWorkItem (according to this post, anyway). Câu hỏi của tôi rất đơn giản: có ai biết tại sao không?TaskFactory.StartNew so với ThreadPool.QueueUserWorkItem

TaskFactory.StartNew có hiệu suất tốt hơn không? Nó có sử dụng ít bộ nhớ hơn không? Hoặc là nó chủ yếu cho các chức năng bổ sung được cung cấp bởi các lớp học Task? Trong trường hợp thứ hai, không StartNew có thể có hiệu suất tồi tệ hơn hơn QueueUserWorkItem?

Dường như với tôi rằng StartNew sẽ thực sự có khả năng sử dụng bộ nhớ hơn hơn QueueUserWorkItem, vì nó trả về một đối tượng Task với mỗi cuộc gọi và tôi hy vọng rằng kết quả trong phân bổ bộ nhớ hơn.

Trong mọi trường hợp, tôi muốn biết thích hợp hơn cho kịch bản hiệu suất cao.

Trả lời

2

Chỉ từ vẻ bề ngoài, các lớp Nhiệm vụ được thiết kế để làm việc với các tính năng song song mới trong .Net 4. Có vẻ như bạn có thể sử dụng trực tiếp Action hoặc Action<T> khi bắt đầu/tạo một tác vụ. Đây là tất cả 100% phỏng đoán, mặc dù, dựa trên poking xung quanh các tài liệu :).

7

Hiệu suất là ... phụ thuộc. Nếu bạn đang làm nhiều nhiệm vụ song song, thì nhiệm vụ 4net sẽ hoạt động tốt hơn, cộng thêm cho bạn nhiều quyền kiểm soát chi tiết hơn (hủy bỏ mạnh mẽ hơn, khả năng chờ nhiều nhiệm vụ cùng lúc, khả năng tạo mối quan hệ công việc cha/con, Khả năng chỉ định LongRunning, v.v., v.v.)

Ngoài ra, khả năng chỉ định TaskScheduler của riêng bạn có nghĩa là bạn có thể tùy chỉnh nó cho nhu cầu của mình. Trình lập lịch tác vụ được tích hợp sẵn có ý thức đa lõi hơn nhiều so với ThreadPool cũ.

Để sử dụng thêm bộ nhớ. Mỗi luồng chứa tối thiểu 1MB bộ nhớ, số lượng nhỏ được sử dụng để lưu trữ một đối tượng nhiệm vụ là không quan trọng. Tôi thực sự nghĩ đó là nỗi lo cuối cùng của bạn.

+0

AFAIK mặc định TaskScheduler sử dụng ThreadPool và không có sự khác biệt giữa chúng khi bạn muốn hỗ trợ đa lõi. Anh chàng thậm chí đã thực hiện một số xét nghiệm: http://stackoverflow.com/a/5219311/152291 – prostynick

6

TaskFactory.StartNew phù hợp hơn cho trường hợp hiệu suất cao.

Bạn có được lợi ích về năng suất nhờ tập hợp các lớp trong System.Threading.Tasks và sự chăm sóc đi vào thiết kế + tích hợp của chúng với các vòng lặp song song và các tùy chọn.

Bạn cũng sẽ nhận được lợi ích hiệu suất vì System.Threading.Tasks được xây dựng trên nền tảng công việc ăn cắp trong nhóm luồng tốt hơn cho địa phương (khi nó quan trọng).

-Rick

+0

Hi Rick, bạn có thể vui lòng cho tôi biết, khi tôi sử dụng Task.Factory.StartNew, điều này có chủ đề từ một hồ bơi và tôi có 1 chủ đề ít hơn trong hồ bơi của tôi? Cảm ơn –

+1

Task.Factory.StartNew sẽ sử dụng hồ bơi chuỗi .net để vâng luồng sẽ đến từ hồ bơi – Rick

+0

Có cách nào để bắt đầu chuỗi mới sẽ không được lấy từ nhóm luồng không? –

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