Antwort

2

Ich würde vorschlagen, die ursprüngliche Sequenz mit einer neuen Observablen, die Sie Objekte füttern, wenn sie ausfallen.

loopSequence 
    .Where(item => item.Failed) 
    .Subscribe(item => 
    { 
     try{ 
      //Do stuff 
      retries.OnNext(new Item { ..., Failed = false }); 
     } catch 
     { 
      retries.OnNext(new Item { ..., Failed = true }); 
     } 
    }); 

Sie sollen auch wirklich vorsichtig sein mit diesem Muster, da ein ständig: Statt

var retries = new ReplaySubject<Foo>(); 
var loopSequence = sequence.ToObservable().Merge(retries); 

loopSequence 
    .Where(item => item.Failed) 
    .Subscribe(item => 
    { 
     try{ 
      //Do stuff 
      item.Failed = false; 
     } catch 
     { 
      item.Failed = true; 
     } 
     retries.OnNext(item); 
    }); 

Es ist allgemein schlechte Praxis betrachtet Zustand der Objekte in den Observablen zu ändern, so dass Sie Transformationen vielleicht prüfen Schaffung Ein fehlendes Element wird Ihre Programmausführung in eine Art Endlosschleife bringen.

+1

Dies ist ein interessanter Ansatz. Sie könnten das Element in ein 'Tuple '' verpacken und jedes Mal, wenn Sie es durch' retries' schieben, das 'int' erhöhen, um die Anzahl der Versuche zu verfolgen. Dies würde Ihnen die Möglichkeit geben, es nach x Versuchen anders zu handhaben. –

+0

Danke für Ihre Antwort. Als ich den Code zum ersten Mal schrieb, löschte ich zuerst Elemente aus der Sequenz und bald merkte ich, dass es nicht funktionierte ... die einzige Lösung war, das ursprüngliche Objekt in ein anderes zu wickeln und ein "gescheitertes" Flag einzufügen. Dein zweiter Code kann ich nicht gut verstehen. Wie genau transformiert Arbeit (ich meine, wo sind sie zurückgegeben)? – CodeArtist

+0

@CodeArtist: Sorry, dieser Code war falsch, und ich habe es jetzt behoben. Die Idee ist, dass Sie nicht den Status jedes Elements ändern, sondern ein neues mit einem anderen Status erstellen. Beachten Sie auch, dass der einzige Grund, warum ich ein neues Element hinzufüge, wenn die Dinge erfolgreich sind, für den Fall ist, dass Sie die Ergebnisse abonnieren müssen: where Failed == false. Wenn Sie das nicht tun müssen, können Sie vermeiden, dass Sie diese in das Wiederholungssubjekt einfügen. – StriplingWarrior

1

Sie können jeden Wert wickeln und die Operationen unabhängig wiederholen:

observableSequence 
    .SelectMany(item => 
    Observable.Return(item) 
     .Select(x => //Do Stuff) 
     //Optional argument, omitting retries infinitely until 
     //success 
     .Retry(3) 
) 

    .Subscribe(item => { 
    //Handle the results 
    }); 

Optional Return eine IScheduler als zweites Argument, das die Reihenfolge ändern können, dass Wiederholungen (rekursiv vs. Trampolin) verarbeitet bekommen.

Verwandte Themen