反应式扩展一次性处理事件

4
如果我需要处理某个事件,通常会编写以下代码:

如果我需要处理某个事件,通常会编写以下代码:

            // part of browser

            UrlEventHandler docReadyDelegate = null;
            var documentReady = new UrlEventHandler((sender, args) =>
            {
                view.DocumentReady -= docReadyDelegate; // unsubscribe
                // some code here. Fired then browser's document is ready!
            });

            docReadyDelegate = documentReady;
            view.DocumentReady += docReadyDelegate; // subscribe

            view.Navigate("http://google.com");

但是我认为这种方法并不是最优美且不太容易理解。我知道可以使用响应式扩展来处理事件,那么如何实现呢?

1个回答

6

试试这个:

    Observable
        .FromEventPattern<UrlEventHandler, UrlEventArgs>(
            h => view.DocumentReady += h, 
            h => view.DocumentReady -= h)
        .Take(1)
        .Subscribe(se =>
        {
            /* code run only once */
        });

由于 .Take(1) ,它只会触发一次,而且会很好地处理事件处理程序的附加和分离。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接