Pensei entender o padrão de espera assíncrona e a Task.Run
operação.
Mas estou me perguntando por que, no exemplo de código a seguir, await
ele não é sincronizado novamente com o thread da interface do usuário depois de retornar da tarefa concluída.
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??
}
Esse código é executado em um aplicativo .NET Framework WPF em um sistema Windows 10 com o Visual Studio 2019 Debugger anexado.
Estou chamando esse código do construtor da minha App
classe.
public App()
{
this.InitializeAsync().ConfigureAwait(true);
}
Talvez não seja o melhor caminho, mas não tenho certeza se esse é o motivo do comportamento estranho.
O código começa com o thread da interface do usuário e deve executar algumas tarefas. Com a await
operação e ConfigureAwait(true)
após a conclusão da tarefa, ela deve continuar no thread principal (1). Mas isso não acontece.
Por quê?