Đầu tiên là một lựa chọn tốt hơn nhiều.
Parallel.ForEach, trong nội bộ, sử dụng a Partitioner<T>
để phân phối bộ sưu tập của bạn vào các mục công việc. Nó sẽ không thực hiện một nhiệm vụ cho mỗi mục, mà thay vào đó là đợt này để giảm chi phí liên quan.
Tùy chọn thứ hai sẽ lên lịch Task
cho mỗi mục trong bộ sưu tập của bạn. Mặc dù các kết quả sẽ (gần như) giống nhau, nhưng điều này sẽ giới thiệu nhiều chi phí hơn mức cần thiết, đặc biệt là đối với các bộ sưu tập lớn và khiến thời gian chạy tổng thể chậm hơn.
FYI - Trình phân vùng được sử dụng có thể được kiểm soát bằng cách sử dụng quá tải thích hợp cho Parallel.ForEach , nếu muốn. Để biết chi tiết, xem Phân vùng tùy chỉnh trên MSDN.
Sự khác biệt chính, tại thời gian chạy, là thứ hai sẽ hoạt động không đồng bộ. Điều này có thể được nhân đôi bằng Parallel.ForEach bằng cách thực hiện:
Task.Factory.StartNew( () => Parallel.ForEach<Item>(items, item => DoSomething(item)));
Bằng cách này, bạn vẫn tận dụng các trình phân vùng, nhưng không chặn cho đến khi hoàn thành thao tác.