Per quanto riguarda questo pezzo di codice:Perché sono Async callback eseguito in WPF UI filo
static async Task<string> testc()
{
Console.WriteLine("helo async " + Thread.CurrentThread.ManagedThreadId);
await Task.Run(() => {
Thread.Sleep(1000);
Console.WriteLine("task " + Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("callback "+Thread.CurrentThread.ManagedThreadId);
return "bob";
}
static void Main(string[] args)
{
Console.WriteLine("helo sync " + Thread.CurrentThread.ManagedThreadId);
testc();
Console.WriteLine("over" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.ReadLine();
}
ottengo il seguente output:
helo sync 10
helo async 10
over10
task 11
callback **11**
che è ok: pezzo di codice dopo await viene eseguito in lo stesso thread del compito stesso.
Ora, se lo faccio in un'applicazione WPF:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Console.WriteLine("helo sync " + Thread.CurrentThread.ManagedThreadId);
testc();
Console.WriteLine("over" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.ReadLine();
}
Genera seguente risultato:
helo sync 8
helo async 8
over8
task 9
callback **8**
Dove possiamo vedere codice dopo attendono di eseguito nel thread UI. Bene, questo è grandioso perché permette di manipolare collezioni osservabili, ecc ... Ma mi stavo chiedendo "Perché?" "Come potrei fare lo stesso?" Questo è legato ad un comportamento di TaskScheduler? Questo è hard-coded in .NET Framework?
Thx per qualsiasi idea tu possa inviare.
+1 ha bisogno di più enfasi sul tuo BTW però. – Phill