PLINQ (song song LINQ) chỉ đơn giản là một cách mới để viết các truy vấn LINQ thông thường để chúng chạy song song - nói cách khác, Khung sẽ tự động quản lý truy vấn của bạn trên nhiều chuỗi sao cho chúng hoàn thành nhanh hơn (tức là sử dụng nhiều lõi CPU).
Ví dụ: giả sử bạn có một chuỗi các chuỗi và bạn muốn có tất cả các chuỗi bắt đầu bằng chữ "A". Bạn có thể viết truy vấn của mình như thế này:
var words = new[] { "Apple", "Banana", "Coconut", "Anvil" };
var myWords = words.Select(s => s.StartsWith("A"));
Và điều này hoạt động tốt. Nếu bạn đã có 50.000 từ để tìm kiếm, tuy nhiên, bạn có thể muốn tận dụng lợi thế của một thực tế rằng mỗi bài kiểm tra là độc lập, và chia này trên nhiều lõi:
var myWords = words.AsParallel().Select(s => s.StartsWith("A"));
Đó là tất cả các bạn phải làm gì để biến một truy vấn thường xuyên thành một song song chạy trên nhiều lõi. Khá gọn gàng.
Các TPL (Parallel Library Task) là hai yếu tố bổ sung cho PLINQ, và họ cùng nhau tạo nên Extensions song song. Trong khi PLINQ chủ yếu dựa trên chức năng kiểu lập trình với không có các tác dụng phụ, tác dụng phụ chính xác là những gì TPL dành cho. Nếu bạn muốn thực sự làm việc song song như trái ngược với chỉ tìm kiếm/lựa chọn những thứ song song, bạn sử dụng TPL.
TPL thực chất là lớp Parallel
cho thấy tình trạng quá tải của For
, Foreach
và Invoke
. Invoke
hơi giống như xếp hàng các nhiệm vụ trong ThreadPool
, nhưng đơn giản hơn một chút để sử dụng. IMO, các bit thú vị hơn là For
và Foreach
. Vì vậy, ví dụ: giả sử bạn có toàn bộ các tệp bạn muốn nén. Bạn có thể viết phiên bản tuần tự thường xuyên:
string[] fileNames = (...);
foreach (string fileName in fileNames)
{
byte[] data = File.ReadAllBytes(fileName);
byte[] compressedData = Compress(data);
string outputFileName = Path.ChangeExtension(fileName, ".zip");
File.WriteAllBytes(outputFileName, compressedData);
}
Một lần nữa, mỗi lần lặp của nén này hoàn toàn độc lập với bất kỳ loại nào khác.Chúng ta có thể tăng tốc độ này lên bằng cách thực hiện một vài trong số họ cùng một lúc:
Parallel.ForEach(fileNames, fileName =>
{
byte[] data = File.ReadAllBytes(fileName);
byte[] compressedData = Compress(data);
string outputFileName = Path.ChangeExtension(fileName, ".zip");
File.WriteAllBytes(outputFileName, compressedData);
});
Và một lần nữa, đó là tất cả nó cần để parallelize hoạt động này. Bây giờ khi chúng ta chạy phương thức CompressFiles
(hoặc bất kỳ phương thức nào chúng ta quyết định gọi nó), nó sẽ sử dụng nhiều lõi CPU và có thể kết thúc bằng một nửa hoặc 1/4 thời gian.
Lợi thế của việc này chỉ là nhét tất cả trong số ThreadPool
là điều này thực sự chạy đồng bộ. Nếu bạn đã sử dụng số ThreadPool
thay vì (hoặc chỉ đơn giản là Thread
trường hợp), bạn phải tìm ra cách tìm ra khi tất cả các tác vụ được hoàn thành và trong khi đây không phải là terribly phức tạp, đó là điều mà rất nhiều người có xu hướng vặn lên hoặc ít nhất cũng gặp rắc rối với. Khi bạn sử dụng lớp học Parallel
, bạn không thực sự phải suy nghĩ về nó; khía cạnh đa luồng được ẩn khỏi bạn, tất cả được xử lý đằng sau hậu trường.
Extensions Reactive (Rx) là thực sự là một con thú khác nhau hoàn toàn. Đó là một cách suy nghĩ khác về xử lý sự kiện. Có rất nhiều tài liệu để đề cập đến điều này, nhưng để tạo ra một câu chuyện dài ngắn, thay vì kết nối các bộ xử lý sự kiện cho các sự kiện, Rx cho phép bạn xử lý chuỗi các sự kiện là ... tốt, trình tự (IEnumerable<T>
). Bạn có thể xử lý các sự kiện theo kiểu lặp đi lặp lại thay vì cho chúng bắn không đồng bộ vào các thời điểm ngẫu nhiên, nơi bạn phải luôn luôn lưu trạng thái để phát hiện một loạt các sự kiện xảy ra theo một thứ tự cụ thể.
Một trong những ví dụ tuyệt vời nhất mà tôi đã tìm thấy của Rx là here. Bỏ qua phần "LINQ to IObservable", nơi anh ta thực hiện một trình xử lý kéo và thả, thường là một nỗi đau trong WPF, chỉ trong 4 dòng mã. Rx cung cấp cho bạn thành phần sự kiện, thứ mà bạn không thực sự có với trình xử lý sự kiện thông thường và đoạn mã như vậy cũng đơn giản để cấu trúc lại thành các lớp hành vi mà bạn có thể đưa vào bất kỳ đâu.
Và đó là nó. Đây là một số tính năng thú vị có trong .NET 4.0. Có nhiều thứ nữa, tất nhiên, nhưng đây là những thứ bạn hỏi về!
Tôi đã chỉnh sửa câu hỏi này để làm rõ nó một chút và bỏ phiếu để mở lại. Điều đó nói rằng, tôi không phải là một chuyên gia .NET, vì vậy tôi có thể đã thực hiện một mess của nó; cảm thấy tự do để chỉnh sửa nó hơn nữa (hoặc thậm chí hoàn nguyên các thay đổi của tôi hoàn toàn) nếu bạn nghĩ rằng tôi đã phạm sai lầm ở đâu đó. Ngoài ra, thẳng thắn, tôi vẫn nghĩ rằng câu hỏi này * cảm thấy * quá rộng và không rõ ràng để phù hợp tốt trên Stack Overflow; nói rằng, vì nó có một câu trả lời rất được tán thành và được chấp nhận, tôi sẵn sàng chấp nhận rằng nó có thể là một ngoại lệ. –
Tôi cho rằng ** tất cả mọi người ** biết 4 điều trên (có thể là tất cả những người có khả năng trả lời câu hỏi này) sẽ biết ** ngay lập tức ** câu hỏi này là gì. Các upvotes và câu trả lời chứng minh điều đó. Dù sao tôi có chỉnh sửa câu hỏi để nó càng rõ ràng càng tốt. – bitbonk