C# 4.0 被动扩展只处理一次事件
如果我需要处理某个事件,我通常会这样编码:C# 4.0 被动扩展只处理一次事件,c#-4.0,event-handling,system.reactive,C# 4.0,Event Handling,System.reactive,如果我需要处理某个事件,我通常会这样编码: // part of browser UrlEventHandler docReadyDelegate = null; var documentReady = new UrlEventHandler((sender, args) => { view.DocumentReady -= docReadyDelegate;
// 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");
但正如我所认为的那样,它既不完美也不美丽。我知道可以使用反应式扩展一次性处理事件。怎么做?试试这个:
Observable
.FromEventPattern<UrlEventHandler, UrlEventArgs>(
h => view.DocumentReady += h,
h => view.DocumentReady -= h)
.Take(1)
.Subscribe(se =>
{
/* code run only once */
});
可观察
.FromEventPattern(
h=>view.DocumentReady+=h,
h=>view.DocumentReady-=h)
.采取(1)
.订阅(se=>
{
/*代码只运行一次*/
});
由于.Take(1)
的原因,它将只触发一次,并且它将很好地处理事件处理程序的所有附加和分离