Ich habe über C# Async-Methoden in den letzten 2 Tagen gelesen und von dem, was ich verstehe, im Gegensatz zu einem Thread (threadpool.queueuserworkitem())
, ein Aufruf an eine asynchrone Methode nicht sofort zurück und es gibt nur zurück, wenn die aufgerufene Methode hits a wait oder complete (oder exception)Async Programmierung Steuerung Fluss
Bitte beachten Sie das folgende Beispiel.
public partial class MainWindow : Window
{
// . . .
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// ONE
Task<int> getLengthTask = AccessTheWebAsync();
// FOUR
int contentLength = await getLengthTask;
// SIX
resultsTextBox.Text +=
String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
}
async Task<int> AccessTheWebAsync()
{
// TWO
HttpClient client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("http://msdn.microsoft.com");
// THREE
string urlContents = await getStringTask;
// FIVE
return urlContents.Length;
}
}
Von dem, was ich sammeln, in dem obigen Code, AccessTheWebAsync()
synchron aufgerufen wird (d. Steuerung nicht sofort zurück, wenn sie aufgerufen wird). In der Zeile "DREI" gibt die Laufzeit die Kontrolle zurück.
Meine Fragen sind:
Wie wirkt sich die Laufzeit entscheiden, wann die Threadpool zu verwenden, oder wenn die Aufgabe in der anrufenden Thread laufen? (d. h. den Code ausführen, ohne die Kontrolle zurückzugeben)
An welchen Punkten im obigen Code werden neue Threads (oder Threadpools) verwendet?
Wenn
AccessTheWebAsync()
etwas rechenintensiv durchgeführt hat, z. B. das Ausführen einer Schleife mit einer Zillion Iterationen, kehrt das Steuerelement erst zum Aufrufer zurück, wenn die Schleife abgeschlossen ist. Ist das richtig?In einer asynchronen Funktion gibt es eine Möglichkeit, die Steuerung sofort zurückzugeben und dann die Arbeit in einem Hintergrund-Thread fortzusetzen? (Genau wie wenn wir threadpool.queueuserworkitem() aufrufen würden)
Ruft eine asynchrone Methode ohne Wartezeit darauf auf (angenommen, es ist möglich), genauso wie das Aufrufen einer nicht asynchronen Methode?