2013-10-01 9 views
5

Trong đơn đăng ký của tôi, tôi đã viết tất cả mã Rx của mình để sử dụng Scheduler.Default. Tôi muốn biết liệu có sự khác biệt giữa việc chỉ định Scheduler.Default và không chỉ định lịch biểu không?System.Reactive.Concurrency.DefaultScheduler

Chiến lược được sử dụng bởi System.Reactive.Concurrency.DefaultScheduler là gì?

Trả lời

7

Rx sử dụng chiến lược thích hợp phụ thuộc vào nền tảng cụ thể PlatformServices được tải - do đó bạn có thể có cách tiếp cận khác trong các trường hợp khác nhau. Việc thực hiện OOB xem xét liệu các luồng có sẵn trên nền tảng của bạn hay không, và nếu như vậy sử dụng các luồng và việc thực hiện Timer nền tảng để lên lịch các mục, nếu không nó sẽ sử dụng các nhiệm vụ. Ví dụ, trường hợp sau này phát sinh trong Windows 8 Apps.

Bạn có thể tìm thấy một video tốt về cách các dịch vụ nền tảng được thực hiện từ các tác giả ở đây: http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-Rx-20-RTM-and-RTW

Nhìn vào đây để thông tin về cách thức điều hành được xây dựng trong cư xử khi bạn làm và không chỉ định một lịch trình: http://msdn.microsoft.com/en-us/library/hh242963(v=vs.103).aspx

5

Có sự khác biệt giữa việc chỉ định Scheduler.Default và không chỉ định lịch biểu. Sử dụng Scheduler.Defaultsẽ giới thiệu hành vi không đồng bộ và có thể đồng thời, trong khi không cung cấp bộ lập lịch để nó tùy theo quyết định của nhà điều hành. Một số nhà khai thác sẽ chọn để thực hiện đồng bộ trong khi những người khác sẽ thực thi không đồng bộ, trong khi những người khác sẽ chọn để nhảy chủ đề. Đây có lẽ là một ý tưởng tồi (đối với hiệu suất và thậm chí có thể chính xác vì quá nhiều đồng thời có thể dẫn bạn vào tình huống bế tắc) để cung cấp Scheduler.Default cho mọi toán tử Rx. Nếu bạn không có yêu cầu lập kế hoạch cụ thể, thì không cung cấp bộ lập lịch và cho phép nhà điều hành chọn những gì cần.

Ví dụ,

này sẽ hoàn thành đồng bộ:

int result = 0; 
Observable.Return(42).Subscribe(v => result = v); 
result == 42; 

trong khi điều này sẽ hoàn thành đồng bộ (và có khả năng trên thread khác):

int result = 0; 
Observable.Return(42, Scheduler.Default).Subscribe(v => result = v); 
result == 0; 

// some time later 
result == 42; 
+1

Thanks.But gì nếu tôi muốn cung cấp một TestScheduler cho mục đích thử nghiệm? –