2016-12-15 4 views
1

Ich suche eine Erweiterungsmethode mit der folgenden Signatur zu erstellen:Wie ein IObservable zurückzukehren <Dialogresult> von Showdialog

public static IObservable<DialogResult> ShowDialog(this Form form); 

Ich weiß nicht, wie diese Arbeit zu bekommen. Das habe ich bisher:

Task<DialogResult> task = Task.Factory.StartNew(() => 
{ 
    return form.ShowDialog(); 
}); 
return task.ToObservable(); 

Edit: Cool, danke Leute. Ich muss wirklich etwas mehr darüber lesen!

+3

Warum willst du das? Und was denkst du wird passieren, wenn du UI in einem Nicht-UI-Thread arbeitest? –

+0

Ich weiß es nicht. Ich bin wirklich neu und versuche, meinen gesamten Code asynchron mit reaktiven Erweiterungen zu schreiben. – potato

+1

Bitte nicht. versuchen Sie nur Code Async auszuführen, wenn es Sinn macht. Sie sollten besser lesen, wenn Sie es anwenden und dann in einer guten Weise anwenden. Dies wird zwangsläufig fehlschlagen. Starre Worte, aber gut gemeinter Rat. Verwenden Sie es zum Beispiel, wenn Sie E/A-Vorgänge ausführen oder wenn Sie in einem separaten Thread mit hoher CPU-Leistung arbeiten müssen. Das Schreiben von Async-Code sollte kein Ziel sein, sondern ein Mittel, um bestimmte Probleme zu lösen. –

Antwort

0

Ich denke, das würde funktionieren, obwohl ich den Punkt nicht verstehe.

public static class Extensions 
{ 
    public static IObservable<DialogResult> ShowDialogObservable(this Form form) 
    { 
     return Observable.Create<DialogResult>(o => 
     { 
      o.OnNext(form.ShowDialog()); 
      return Disposable.Empty; 
     }); 
    } 
} 
+0

Danke, ich versuche das DialogResult asynchron zurückzugeben, obwohl ich nicht weiß, ob es mit ShowDialog möglich ist. – potato

+0

@Peter hatte hier einen soliden Rat. Es gibt keine Möglichkeit, eine geschlossene synchrone Methode wirklich in eine asynchrone zu verwandeln. 'ShowDialog' soll eine blockierende, synchrone Methode sein. Wenn Sie das nicht blockierende Formular haben wollten, würden Sie 'Show' verwenden. Dadurch werden weiterhin Threads, Ressourcen usw. blockiert. – Shlomo

Verwandte Themen