Desidero utilizzare le estensioni reattive per trasformare alcuni messaggi e inoltrarli dopo un breve ritardo.Ritardo e deduplicazione utilizzando le estensioni reattive (Rx)
I messaggi sembrano qualcosa di simile:
class InMsg
{
int GroupId { get; set; }
int Delay { get; set; }
string Content { get; set; }
}
L'output simile a questa:
class OutMsg
{
int GroupId { get; set; }
string Content { get; set; }
OutMsg(InMsg in)
{
GroupId = in.GroupId;
Content = Transform(in.Content); // function omitted
}
}
ci sono un paio di requisiti:
- La lunghezza del ritardo dipende dal contenuto del messaggio.
- Ogni messaggio ha un ID gruppo
- Se un nuovo messaggio arriva con lo stesso GroupId di un messaggio in ritardo in attesa di trasmissione, il primo messaggio deve essere eliminato e solo il secondo trasmesso dopo un nuovo periodo di ritardo.
Dato un'osservabile <inMsg> e una funzione di invio:
IObservable<InMsg> inMsgs = ...;
void Send(OutMsg o)
{
... // publishes transformed messages
}
ho capito che posso usare Selezionare per eseguire la trasformazione.
void SetUp()
{
inMsgs.Select(i => new OutMsg(i)).Subscribe(Send);
}
- Come posso applicare un messaggio specificano ritardare? (Si noti che questo potrebbe/dovrebbe comportare la consegna fuori servizio dei messaggi.)
- Come posso deduplicare i messaggi con lo stesso GroupId?
- Rx è in grado di risolvere questo problema?
- C'è un altro modo per risolvere questo?
Ho avuto un gioco con questo e non fa proprio quello che mi aspetterei. La sottoscrizione riceve un "System.Collections.Generic.AnonymousObservable'1 [OutMsg]" – chillitom
Sembra che tu non stia chiamando 'Switch'.Se si esegue il "passaggio del mouse" in "Seleziona" in Visual Studio, è necessario indicare che restituisce un IObservable. Se restituisce 'IObservable >', non stai chiamando Switch –