C# 为带有Rx的每个事件生成具有延迟的第二个后续事件
目前,我正在研究使用反应式框架处理MIDI消息 生成NoteOn事件时,它必须在NoteOff事件之后。那么,在每个音符之后发送第二个事件并延迟一定时间的最佳方式是什么呢 比如:C# 为带有Rx的每个事件生成具有延迟的第二个后续事件,c#,.net,linq,system.reactive,C#,.net,Linq,System.reactive,目前,我正在研究使用反应式框架处理MIDI消息 生成NoteOn事件时,它必须在NoteOff事件之后。那么,在每个音符之后发送第二个事件并延迟一定时间的最佳方式是什么呢 比如: //pseudo code var noteOnObservable = GetNoteOns(); var noteOffObservable = noteOnObservable.ForEach(e => new NoteOffMessage(e.MidiNote)) .Delay(e =>
//pseudo code
var noteOnObservable = GetNoteOns();
var noteOffObservable = noteOnObservable.ForEach(e => new NoteOffMessage(e.MidiNote))
.Delay(e => GetDelay(e));
var notes = noteOnObservable.Merge(noteOffObservable);
其中NoteOn和NoteOff消息的类型都是相同的
MidiMessage
,与您使用的消息几乎完全相同。理想情况下,您可以发布noteOnObservable
,这样您就不会有多个订阅:
var noteOnObservable = GetNoteOns().Publish().RefCount();
var noteOffObservable = noteOnObservable
.Select(e => new NoteOffMessage(e.MidiNote))
.Delay(e => GetDelay(e));
var notes = noteOnObservable.Merge(noteOffObservable);
您没有描述GetDelay
返回的类型。如果它返回一个TimeSpan
,那么您必须将其转换为可观测值。如果您可以在GetDelay
中使用该选项,则该选项有效。如果没有,则可以执行以下操作:
var noteOnObservable = GetNoteOns().Publish().RefCount();
var noteOffObservable = noteOnObservable
.Select(e => new NoteOffMessage(e.MidiNote))
.Delay(e => Observable.Timer(GetDelay(e)));
var notes = noteOnObservable.Merge(noteOffObservable);
不知道我离得这么近。感谢Publish().RefCount()的改进。尚未指定GetDelay。。。这是下一个任务。可观测计时器会为每个事件的单个延迟工作吗?是的。如果您想指定一个静态的
TimeSpan
(对所有事件都是统一的),那么您可以只执行.Delay(TimeSpan.frommilluses(100))
或任何适当的时间。@Shlomo-一个稍微简洁的方法是这样做:var notes=GetNoteOns().Publish(gnos=>gnos.Merge(gnos.Select)(e=>newnoteoffmessage延迟(e=>GetDelay(e));
。