Tôi có một kịch bản tương tác người dùng mà tôi muốn xử lý với Rx.Rx và tác vụ - hủy tác vụ đang chạy khi tác vụ mới được sinh ra?
Kịch bản tương tự như các kinh điển "khi dùng ngừng nhập làm một số công việc" (thường, tìm kiếm những gì người dùng đã gõ cho đến nay) (1) - nhưng tôi cũng cần phải:
- (2) chỉ nhận được mới nhất kết quả của đơn vị "làm một số công việc" (xem bên dưới)
- (3) khi một đơn vị công việc mới bắt đầu, hủy bất kỳ công việc nào đang diễn ra (trong trường hợp của tôi là CPU chuyên sâu)
Đối với (1), tôi sử dụng IObservable
cho các sự kiện của người dùng, được điều chỉnh với .Throttle()
để chỉ kích hoạt khi tạm dừng giữa các sự kiện ("người dùng ngừng nhập").
Từ đó, i .Select(_ => CreateMyTask(...).ToObservable())
.
Điều này mang lại cho tôi một IObservable<IObservable<T>>
trong đó mỗi quan sát bên trong kết thúc tốt đẹp một tác vụ duy nhất.
Để nhận (2) Cuối cùng, tôi áp dụng .Switch()
để chỉ nhận kết quả từ đơn vị công việc mới nhất.
Còn (3) - hủy các tác vụ đang chờ xử lý?
Nếu tôi hiểu đúng, bất cứ khi nào có một mới nội IObservable<T>
, phương pháp .Switch()
đặt mua nó và unsubscribes từ trước đó (s), khiến chúng Dispose()
.
Có thể có thể bằng cách nào đó có dây để kích hoạt tác vụ hủy?
Không, tôi không có yêu cầu sử dụng Tác vụ. Nó chỉ cảm thấy tự nhiên để đóng gói hành động xử lý chuyên sâu trong một. Tôi sẽ xem xét giải pháp của bạn :) –
@CristiDiaconescu - Thành thật mà nói tôi có thể thấy những gì TPL đã làm cho nó, nhưng tôi đã luôn luôn thấy rằng các giải pháp của tôi bằng cách sử dụng Rx luôn luôn nhiều neater và nhiều hơn nữa thể hiện. Tôi cố gắng tránh TPL ủng hộ Rx. – Enigmativity
Nếu bạn đang sử dụng Rx, phương thức 'Start' được đề xuất của bạn có thể dễ hiểu hơn như' Bắt đầu (Func work) 'và sử dụng' CancellationDisposable' để tạo mã thông báo thay vì dùng một lần tùy chỉnh. Hoặc, nếu bạn * thực sự * ôm Rx: 'Bắt đầu (Func , T> công việc)' nơi phương thức 'Bắt đầu' của bạn cho nó một' AsyncSubject' mà nó báo hiệu hủy khi đăng ký được xử lý. 'Func ' chỉ cảm thấy khó khăn và không theo tinh thần của Rx. –
Brandon