This answer sagtWarum Sync-Kontext funktioniert nicht für warten?
standardmäßig wird der await Bediener den aktuellen „Kontext“ erfassen und dass die Asynchron-Methode wieder aufnehmen verwenden.
ich diesen Code in meiner Konsole app bin versucht:
static void Main(string[] args)
{
Test().Wait();
}
private static async Task Test()
{
var context = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(context);
Console.WriteLine("Thread before: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(await GetResultAsync());
Console.WriteLine("Thread after: " + Thread.CurrentThread.ManagedThreadId);
}
private static async Task<string> GetResultAsync()
{
return await Task.Factory.StartNew(() =>
{
Console.WriteLine("Thread inside: " + Thread.CurrentThread.ManagedThreadId);
return "Hello stackoverflow!";
});
}
... und raus:
Thread before: 1
Thread inside: 3
Hello stackoverflow!
Thread after: 3
Warum? Und wie sollte ich den Sync-Kontext einstellen, wenn ich nach dem Warten den gleichen Thread verwenden möchte?
Sie verwenden den Begriff Kontext hier explizit, weil nicht alle Kontexte an einen einzelnen Thread gebunden sind. In einer Konsolenanwendung gibt es keine integrierten Gründe, einen Thread vor anderen zu bevorzugen (im Gegensatz zu UI-Frameworks mit einem UI-Thread). –