C# .NET响应式扩展(Rx):在所有事件完成后采取行动

C# .NET响应式扩展(Rx):在所有事件完成后采取行动,c#,.net,system.reactive,C#,.net,System.reactive,作为概念证明,我想在选中复选框并按下文本框中的键(按任意顺序)后,在文本框中写入“完成”。我希望这段代码能够处理这个问题,但它会在任何一个事件发生时立即完成编写。谢谢你的帮助 var seq = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged") .Merge(Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress")

作为概念证明,我想在选中复选框并按下文本框中的键(按任意顺序)后,在文本框中写入“完成”。我希望这段代码能够处理这个问题,但它会在任何一个事件发生时立即完成编写。谢谢你的帮助

var seq = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged")
   .Merge(Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress"));

seq.Subscribe((unused) => this.resultTextBox.Text = "Done");
var seq=Observable.FromEvent(this.checkBox,“CheckedChanged”)
.Merge(Observable.FromEvent(this.textBox,“KeyPress”));
seq.Subscribe((未使用)=>this.resultTextBox.Text=“完成”);

< /代码> 如果您需要两个事件都发生,请考虑使用zip。如果任何合并源引发该事件,则“合并”将触发该事件。

您可以使用Observable。如果是这样(我为本例添加了一个附加复选框):

var CheckedChanged=Observable.FromEvent(this.checkBox,“CheckedChanged”);
var check1Changed=可观察的.FromEvent(this.checkBox1,“CheckedChanged”);
var keyPress=Observable.FromEvent(这个.textBox,“keyPress”);
var plan1=检查已更改
.和(选中1更改)。和(按键)
。然后((cc,cc1,kp)=>“完成”);
var when=可观察的时间(计划1);
when.Subscribe((result)=>this.resultTextBox.Text=result);
此外,如果您可以将其他计划连接在一起,例如,如果在一组事件触发时或在另一组事件触发时可以“完成”事情:

var checkChanged  = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged");
var check1Changed = Observable.FromEvent<EventArgs>(this.checkBox1, "CheckedChanged");
var keyPress      = Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress");
var keyPress1     = Observable.FromEvent<KeyPressEventArgs>(this.textBox1, "KeyPress");

var plan1 = checkChanged.And(check1Changed).And(keyPress).Then((cc, cc1, kp) => "Done.");
var plan2 = keyPress.And(keyPress1).Then((kp, kp1) => "Alternate done.");

var join = Observable.When(plan1, plan2);
var CheckedChanged=Observable.FromEvent(this.checkBox,“CheckedChanged”);
var check1Changed=可观察的.FromEvent(this.checkBox1,“CheckedChanged”);
var keyPress=Observable.FromEvent(这个.textBox,“keyPress”);
var keyPress1=可观察的.FromEvent(this.textBox1,“KeyPress”);
var plan1=checkChanged.和(check1Changed).和(按键)。然后((cc,cc1,kp)=>“完成”);
var plan2=keyPress.和(keyPress1)。然后((kp,kp1)=>“备用完成”);
var join=可观察的时间(计划1,计划2);

如果有10个不同的事件,而不是两个,该怎么办?Zip返回Observable,这将在两个源都引发事件时触发事件(如rendezvous)。你可以将这个结果与另一个结果压缩,以获得连接到3个源等的可观察结果。这是一个合理的方法吗?那么使用Observable.Join和Ands呢?谢谢-我也玩过这种方法。如果这些事件是异步的。网络电话,你喜欢这种风格吗?我喜欢。处理其中一个事件中的错误条件是一件小事吗?顺便说一句,我还没有尝试使用Zip执行此操作。也许我稍后会尝试比较。通过采取OnError操作的Subscribe重载处理错误。e、 g.:join.Subscribe((result)=>this.resultTextBox.Text=result,ex=>Console.WriteLine(“错误:{0}”,ex.Message));
var checkChanged  = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged");
var check1Changed = Observable.FromEvent<EventArgs>(this.checkBox1, "CheckedChanged");
var keyPress      = Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress");
var keyPress1     = Observable.FromEvent<KeyPressEventArgs>(this.textBox1, "KeyPress");

var plan1 = checkChanged.And(check1Changed).And(keyPress).Then((cc, cc1, kp) => "Done.");
var plan2 = keyPress.And(keyPress1).Then((kp, kp1) => "Alternate done.");

var join = Observable.When(plan1, plan2);