Chúng tôi đang sử dụng Rx để theo dõi hoạt động trong ứng dụng Silverlight của chúng tôi để chúng tôi có thể hiển thị thông báo cho người dùng sau một khoảng thời gian không hoạt động.Thêm một chuỗi quan sát được sau khi đăng ký
Chúng tôi đang chuyển sự kiện (di chuyển chuột, v.v.) thành các quan sát và sau đó hợp nhất các quan sát lại với nhau để tạo ra một (allActivity) duy nhất có thể quan sát được. Sau đó chúng tôi điều chỉnh allActivity bằng cách sử dụng một khoảng thời gian và một thứ gì đó đăng ký để được thông báo khi hệ thống không hoạt động trong một khoảng thời gian.
Làm cách nào để thêm chuỗi/chuỗi quan sát mới vào sau đăng ký (để đăng ký chọn tùy chọn này mà không hủy đăng ký và đăng ký lại).
ví dụ: hợp nhất một vài chuỗi với nhau, điều tiết, đăng ký. Bây giờ thêm một chuỗi bổ sung vào quan sát đã được đăng ký.
Ví dụ mã:
private IObservable<DateTime> allActivity;
public void CreateActivityObservables(UIElement uiElement)
{
// Create IObservables of event types we are interested in and project them as DateTimes
// These are our observables sequences that can push data to subscribers/ observers
// NB: These are like IQueryables in the sense that they do not iterate over the sequence just provide an IObservable type
var mouseMoveActivity = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(h => uiElement.MouseMove += h, h => uiElement.MouseMove -= h)
.Select(o => DateTime.Now);
var mouseLeftButtonActivity = Observable.FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(h => uiElement.MouseLeftButtonDown += h, h => uiElement.MouseLeftButtonDown -= h)
.Select(o => DateTime.Now);
var mouseRightButtonActivity = Observable.FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(h => uiElement.MouseRightButtonDown += h, h => uiElement.MouseRightButtonDown -= h)
.Select(o => DateTime.Now);
var mouseWheelActivity = Observable.FromEventPattern<MouseWheelEventHandler, MouseWheelEventArgs>(h => uiElement.MouseWheel += h, h => uiElement.MouseWheel -= h)
.Select(o => DateTime.Now);
var keyboardActivity = Observable.FromEventPattern<KeyEventHandler, KeyEventArgs>(h => uiElement.KeyDown += h, h => uiElement.KeyDown -= h)
.Select(o => DateTime.Now);
var streetViewContainer = HtmlPage.Document.GetElementById("streetViewContainer");
var mouseMoveHandler = new EventHandler<HtmlEventArgs>(this.Moo);
bool b = streetViewContainer.AttachEvent("mousemove", mouseMoveHandler);
var browserActivity = Observable.FromEventPattern<Landmark.QDesk.ApplicationServices.IdleTimeoutService.MouseMoveHandler, HtmlEventArgs>(h => this.MyMouseMove += h, h => this.MyMouseMove -= h).Select(o => DateTime.Now);
// Merge the IObservables<DateTime> together into one stream/ sequence
this.allActivity = mouseMoveActivity.Merge(mouseLeftButtonActivity)
.Merge(mouseRightButtonActivity)
.Merge(mouseWheelActivity)
.Merge(keyboardActivity)
.Merge(browserActivity);
}
public IDisposable Subscribe(TimeSpan timeSpan, Action<DateTime> timeoutAction)
{
IObservable<DateTime> timeoutNotification = this.allActivity.Merge (IdleTimeoutService.GetDateTimeNowObservable())
.Throttle(timeSpan)
.ObserveOn(Scheduler.ThreadPool);
return timeoutNotification.Subscribe(timeoutAction);
}
Xin chào Gideon, cảm ơn vì điều này. Câu trả lời của bạn, sử dụng một chủ đề, rất giống với câu trả lời được cung cấp bởi Dave Sexton trên diễn đàn sau (Tôi đã thử nghiệm giải pháp của Dave và dường như nó hoạt động rất tốt): http://social.msdn.microsoft.com/Forums/is/rx/thread/a896d6ff-0cf3-44c9-bbaa-02ab256e21b3 – user1040208
@ user1040208 Một khác biệt mà tôi thấy là phiên bản của Dave sẽ có đăng ký các nguồn quan sát cho mỗi người quan sát, nơi tôi sẽ chỉ có một (chủ đề) bất kể số lượng người quan sát. Đối với việc sử dụng này, nó không nên quan trọng nhiều, nhưng nó là đáng chú ý nếu cách tiếp cận này được sử dụng ở nơi khác. –