为每个带有 Rx 的事件生成带有延迟的第二个后续事件

Generate a second follow up Event with delay for each Event with Rx

目前我正在研究使用反应式框架处理 MIDI 消息。

生成 NoteOn 事件时,它必须跟在 NoteOff 事件之后。那么在每次 NoteOn 之后以一定的延迟发送第二个事件的最佳方法是什么?

类似于:

//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 returns。如果它 returns a 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);