2012-01-04 57 views
9

Các phiên bản cũ hơn của Reactive Extensions có cả phương pháp mở rộng Chạy và Làm cho IEnumerable. Cả hai dường như đang làm điều tương tự, và tôi không chắc chắn về sự khác biệt.Whats sự khác biệt giữa Run và Do trong Rx?

Tôi hỏi vì tôi đang nâng cấp một số mã cũ hơn và Do đã được chuyển sang Ix (chưa có bản phát hành ổn định) và có vẻ như Run đã được thay thế bằng ForEach.

+0

Jonathan, có bất kỳ câu trả lời nào giúp bạn không? Nếu có, vui lòng đánh dấu là câu trả lời. Cảm ơn! –

+1

Đối với bất cứ ai tự hỏi, tương đương với "Chạy" trong các bản dựng Rx mới hơn là phương thức mở rộng Observable.Wait(). Phương pháp này chặn thực thi cho đến khi giá trị cuối cùng, hoặc một ngoại lệ, được nhận từ nguồn quan sát được. Gọi nó gây ra một đăng ký xảy ra. – thefellow3j

Trả lời

10

Chỉ định rằng một số tác dụng phụ sẽ diễn ra khi được thực hiện và trả về chuỗi có tác dụng phụ.

Chạy liệt kê chuỗi và trả về khoảng trống.

Hãy nghĩ về điều này như sau: Làm "thẻ" chuỗi với các tác dụng phụ. Những tác dụng phụ đó sẽ chỉ xảy ra khi trình tự được liệt kê. Do trả về chuỗi mới với các tác dụng phụ.

// Example of .Do 
var elements = new[] { 1, 2, 3 }; 
var elementsWithSideEffects = elements.Do(e => MessageBox.Show(e)); // No Message Boxes shown yet! 
elementsWithSideEffects.Run(); // 3 message boxes shown 

Run, mặt khác, liệt kê thứ tự: Run(), hoặc tùy chọn gắn tác dụng phụ, sau đó liệt kê các trình tự: Run (hành động)

// Example of .Run with its own side effects: 
var elements = new[] { 1, 2, 3 }; 
elements.Run(e => MessageBox.Show(e)); // 3 Message Boxes shown. 
+2

Tôi nghĩ rằng bạn cần một 'AsObservable()' sau khi khai báo mảng của bạn (nếu không nó đang chạy trên 'IEnumerable'). –

+0

Erm, nếu tôi không nhầm, .Do và .Run là một phần của Tiện ích tương tác (IX), hoạt động trên IEnumerable . –

+0

'Do' vẫn còn trên cả IEnumerable và IObservable. 'Run' * đã được * trên cả hai như là khung thời gian phát hành WP7, nhưng bây giờ chỉ có sẵn như là một phần của Ix. Có nói rằng, bây giờ tôi nhận ra rằng OP đã thực sự đề cập đến IEnumerable và không IObservable. Xin lỗi vì sự nhầm lẫn. –

8

Bạn có thể nghĩ Do như "Peek" vì nó thực hiện các hiệu ứng phụ cho mỗi giá trị/lỗi/hoàn thành nhưng không thể thay đổi giá trị của chúng kể từ khi lambdas chuyển tất cả các khoảng trống trả về. Nó tương tự như Subscribe, nhưng nó không phá vỡ đơn nguyên ("chuỗi") khi nó trả về IObservable<T>. Do thường được sử dụng để ghi nhật ký.

Run về cơ bản là phiên bản chặn Subscribe, nghĩa là việc thực thi không tiếp tục qua dòng đó cho đến khi OnComplete/OnError được gọi.

+0

Câu trả lời tuyệt vời, điều này đã làm cho đồng xu giảm giá đối với tôi. – Contango

6

Hãy suy nghĩ Làm như một đồng hồ Amp: bạn cắt mở mạch (chuỗi các toán tử truy vấn) và dây lên một đồng hồ (một đại biểu hành động) cho hiện tại (các giá trị chảy qua các toán tử truy vấn). Đối với mỗi electron (giá trị) chảy qua mạch (truy vấn), đồng hồ (hành động) thực hiện một số công việc. Lưu ý rằng mạch (truy vấn) vẫn được tắt nguồn (lười). Nó không phải cho đến khi bạn cắm pin (chạy một vòng lặp foreach) rằng hiện tại (giá trị) đang chảy. Một cách đơn giản để bật mạch (chạy truy vấn) là sử dụng pin (toán tử ForEach).

+0

Tôi thích tương tự của bạn nhưng ForEach là một tải, không pin:) Cho đến khi mạch được mở, không có gì xảy ra. –

3

Thực hiện các tác vụ như các nhà khai thác LINQ khác như Chọn hoặc Địa điểm - không có gì xảy ra nếu bạn chỉ sử dụng nó, bạn phải có foreach để điều gì đó xảy ra. Chạy/ForEach/Theo dõi các hành vi như tuyên bố foreach, nó thực thi ngay lập tức.

Nếu bạn không rõ 100% thời điểm sử dụng, hãy tránh Thực hiện và chỉ sử dụng ForEach/Run.

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