反应性扩展处理事件一次

时间:2014-10-09 12:22:37

标签: c#-4.0 event-handling system.reactive

如果我需要处理某个事件,我通常会这样编码:

            // 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");

但我觉得它不是最佳而不是美丽。我知道可以使用Reactive Extensions来处理事件一次。怎么样?

1 个答案:

答案 0 :(得分:6)

试试这个:

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

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