Ich benutze die Vorlage Modern UI for WPF in einer .NET 4.0-Anwendung, in der eine Seite einen asynchronen Befehl ausführen muss, bevor sie zu einer anderen Seite zurück navigiert. Zur gleichen Zeit muss der UI-Thread während der Ausführung des Befehls entsperrt werden. Wenn ich dies tun:Führe einen Async-Befehl aus, bevor du zurück navigierst
public void OnNavigatingFrom(FirstFloor.ModernUI.Windows.Navigation.NavigatingCancelEventArgs e)
{
TaskEx.Run(() =>
{
//Replace Sleep call by the async command execution
System.Threading.Thread.Sleep(5000);
}).Wait();}
Die OnNavigatingFrom wartet, bevor die Navigation zurück, aber die UI wird während dieser Zeit gesperrt.
Haben Sie Ideen, wie Sie den asynchronen Code in einem anderen Kontext ausführen und OnNavigatingFrom "synchron" ausführen?
EDIT: Es gibt eine similar thread mit einem Workaround und keine schlüssige Antwort.
Sie wissen, Warten ist ein blockierender Anruf? –
Ich mache und ich weiß, das ist ein Problem. Wie kann ich es nicht blockierend machen, wenn man bedenkt, dass die aufrufende Methode (OnNavigatingFrom) erst nach Abschluss des Vorgangs zurückkehren kann? –
Wenn * (und nur wenn) * die 'OnNavigatingFrom'-Methode ein Event-Handler ist, können Sie es als 'public async void' setzen (Danke, dass Sie viel Literatur von Stephen Cleary gelesen haben). Damit können Sie 'erwarten' verwenden. Z.B. 'erwarten DoSomethingAsync();'. Die aufrufende Methode wird nicht zurückgeben, bis die erwartete Aufgabe abgeschlossen ist –