Ich bin ziemlich sicher, das wurde bereits beantwortet und ich lese viele verwandte Sachen, aber irgendwie bekomme ich es nicht in meinem Code zu arbeiten. Hier ist die genaue Codebasis.Wie und wann retour von der erwarteten (asynchronen) Methode
ich dieses async Methode in meiner Bibliothek haben, die eine Zeichenfolge auf dabei einige DB-Einträge zurückgibt:
public class MyLibrary
{
public async Task<string> DoSomethingAsync()
{
return await DoAsync();
}
// some private method, with multiple parameters
private Task<string> DoAsync()
{
return Task.Run(() => Do());
}
}
nun auf UI, führte unter einen gefrorenen Zustand oder Deadlock:
var myTask = MyLibraryobject.DoSomethingAsync();
console.Write(myTask.Result);
Seit mein Aufruf ist erwartbar, ich denke, UI-Thread wartet auf meinen Anruf, um sein Geschäft zu beenden und das Ergebnis zu bevölkern, nicht wahr? Oder da der Anruf in einem anderen Thread ausgeführt wird, ist die Aufgabe möglicherweise noch nicht abgeschlossen, wenn mein Cursor die Zeile 2 erreicht. Also, was nun? der Cursor wartet, bis die Aufgabe abgeschlossen ist oder die Zeile 2 ausgeführt wird, wenn die Aufgabe abgeschlossen ist? klingt synchron zu mir ..
Auch wenn überhaupt, ich möchte 'explizit' warten, bis die Aufgabe beendet ist, wie kann ich das erzwingen? einige Beiträge, schlug wie unten zu tun, die gab mir das Ergebnis, sondern schuf etwas mehr Verwirrung:
var myTask = Task.Run(async() => await MyLibraryobject.DoSomethingAsync());
myTask.Wait();
console.Write(myTask.Result);
Was oben ist passiert? Warum sollte ich eine andere Aufgabe erstellen und sie warten lassen? kann ich nicht auf den Thread warten, der von der Async-Methode verwendet wird? Auch hier fehlen mir einige grundlegende Dinge.
Schließlich ist dies ein Async-Aufruf, aber der UI-Thread wartet darauf, dass er abgeschlossen wird, und gibt mir den Eindruck, dass er synchron ist. Denke ich es richtig? Was ist der Hauptzweck von asynchronen Methoden, die etwas zurückgeben und die UI darauf wartet, dass sie abgeschlossen wird?
Auch was ist der Unterschied zwischen einem Fire-and-Forget-Aufruf, der nicht asynchron und asynchron ist? Gibt es einen Vorteil dafür, dass die Task für solche Aufrufe nicht storniert wird?
Ich bin ziemlich sicher, ein gebrochener Link, der all diese Teile in meinem Gehirn verbindet. Kann mir das bitte jemand erklären?
Wenn Sie eine asynchrone Methode aufrufen, können Sie nicht garantieren, dass der Inhalt in einem anderen Thread als dem aufrufenden Thread ausgeführt wird. Deshalb sollten Sie es irgendwann in 'Task.Run' (oder' Task.Factory.StartNew') einfügen. Wenn Sie 'myTask.Result 'aufrufen, ist' myTask.Wait() 'außerdem implizit. Um das Blockieren der Thread-Benutzeroberfläche zu vermeiden, sollten Sie Ihre Ereignishandlermethode als async markieren. – Kalten