Ich habe den folgenden Code (vereinfacht für Buchungszwecke).Convert Event based Code zu Rx
public class SomeDataObject
{
public delegate void ReadyEventHandler;
public delegate void ErrorEventHandler;
public event ReadyEventHandler Ready;
public event ErrorEventHandler Error;
...
}
pubic class ConsumerClass
{
private SomeDataObject dataObject;
private Task<List<string>> GetStrings()
{
List<string> results = new List<string>();
var tcs = new TaskCompletionSource<List<string>>();
SomeDataObject.ReadyEventHandler ReadyHandler = null;
SomeDataObject.ErrorEventHandler ErrorHandler = null;
ReadyHandler +=() =>
{
for (int i =0; i < dataObject.ItemCount; i++)
results.Add(dataObject[i].ToString());
tcs.TrySetResult(results);
}
ErrorHandler +=()
{
tcs.TrySetException(new Exception("oops!");
}
dataObject.Ready += ReadyHandler;
dataObject.Error += ErrorHandler;
dataObject.DoRequest();
}
}
Die Idee ist, dass, wenn doRequest Anruf getätigt wird, wird SomeDataObject einige Daten erhalten und entweder die Bereit oder Fehlerereignisse erhöhen (Details nicht wichtig!). Wenn Daten verfügbar sind, gibt der ItemCount an, wie viele Artikel verfügbar sind.
Ich bin neu in Rx und kann kein vergleichbares Beispiel finden. Also ist es möglich, dies in Rx zu konvertieren, so dass IObservable<string>
anstelle von Task<List<string>>
mit Observable.Create irgendwie zurückgegeben wird?
Grüße Alan
Können Sie uns mehr über die SomeDataObject API erzählen? Es scheint ein bisschen seltsam. Ist es möglich DoRequest() mehr als einmal pro Instanz aufzurufen? Wenn ja, können Anrufe getätigt werden, während sich eine bestehende Anfrage im Flug befindet? Ist es so konzipiert, dass es nur einen Aufruf gibt, aber die Ergebnisse mit mehreren Konsumenten teilt? Es fühlt sich an, als würde DoRequest ein Handle zurückgeben, mit dem die Ergebnisse konsumiert werden können (was eine Aufgabe oder IObservable sein könnte). Wenn Sie einen Fehler haben, erwarten Sie, dass Sie DoRequest() erneut aufrufen können? –
All dies ist wichtig, denn sobald ein Observable-Stream eine Ausnahme hat, werden keine weiteren Ereignisse ausgelöst - es könnte also besser sein, Fehler in TResult darzustellen als die Observable oder Task zu sprengen usw. –
James, DoRequest kann nur aufgerufen werden Einmal. Es behält den internen Zustand bei. Es ist tatsächlich Teil einer externen COM-Bibliothek, über die ich keine Kontrolle habe. –