In einer C# -Konsolenanwendung, die System.Reactive.Linq verwendet, versuche ich eine Observable zu erstellen, wobei jedes Element das String-Ergebnis einer Verarbeitung durch eine andere Observable ist. Ich habe eine einfache Repro mit Strings und Zeichen erstellt. Warnung, dieses Beispiel ist vollständig CONTRIVED, und der Punkt ist, dass die verschachtelte .Wait() hängt.Nested Observable hängt an Wait()
class Program
{
static void Main(string[] args)
{
string[] fileNames = { "file1.doxc", "file2.xlsx", "file3.pptx" };
IObservable<string> files = fileNames.ToObservable();
string[] extensions = files.Select(fn =>
{
var extension = fn.ToObservable()
.TakeLast(4)
.ToArray()
.Wait(); // <<<<<<<<<<<<< HANG HERE
return new string(extension);
})
.ToArray()
.Wait();
}
}
Wieder, das ist nicht, wie ich das Suffix vieler Dateinamen finden würde. Die Frage ist, wie ich ein Observable von Strings erzeugen kann, wobei die Strings aus einer abgeschlossenen Observablen berechnet werden.
Wenn ich diesen Code herausziehe und es alleine leite, ist es in Ordnung.
Es gibt etwas über die verschachtelten Wait() auf den async Methoden, die ich nicht verstehe.
Wie kann ich die verschachtelten asynchronen Observablen codieren, damit ich ein einfaches Array von Strings erstellen kann?
Dank
-Johannes
Ihre Methoden sind ** nicht ** asynchron: Wait() ist eine blockierende Operation ... Siehe https://stackoverflow.com/questions/37801699/what-does-the-wait-operator-in-rx -net-do –
Können Sie erklären, warum Sie 'Wait()' in erster Linie verwenden? –