Ich dachte, ich hätte das asynchrone Wartemuster und die Task.Run
Operation verstanden.
Ich frage mich jedoch, warum im folgenden Codebeispiel die await
Synchronisierung nach der Rückkehr von der abgeschlossenen Aufgabe nicht wieder mit dem UI-Thread synchronisiert wird.
public async Task InitializeAsync()
{
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // "Thread: 1"
double value = await Task.Run(() =>
{
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6
// Do some CPU expensive stuff
double x = 42;
for (int i = 0; i < 100000000; i++)
{
x += i - Math.PI;
}
return x;
}).ConfigureAwait(true);
Console.WriteLine($"Result: {value}");
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6 - WHY??
}
Dieser Code wird in einer .NET Framework WPF-Anwendung auf einem Windows 10-System mit angeschlossenem Visual Studio 2019-Debugger ausgeführt.
Ich rufe diesen Code vom Konstruktor meiner App
Klasse auf.
public App()
{
this.InitializeAsync().ConfigureAwait(true);
}
Vielleicht ist es nicht der beste Weg, aber ich bin mir nicht sicher, ob dies der Grund für das seltsame Verhalten ist.
Der Code beginnt mit dem UI-Thread und sollte einige Aufgaben ausführen. Mit der await
Operation und ConfigureAwait(true)
nach Beendigung der Aufgabe sollte sie auf dem Haupt-Thread (1) fortgesetzt werden. Aber das tut es nicht.
Warum?