Есть консольный проект с использованием async await.
Его вывод:
Main(1): Th= '8', TaskId= ''
fAsync(1): Th= '8', TaskId= ''
DONE
ff(1): Th= '9', TaskId= '1'
ff(2): Th= '9', TaskId= '1'
fAsync(2): Th= '9', TaskId= ''
Т.е. асинхронная операция выполняется в отдельном потоке (8). И завершается (тело метода после await) тоже в нём (9).
А в WinForms-проекте вывод такой:
Main(1): Th= '9', TaskId= ''
fAsync(1): Th= '9', TaskId= ''
ff(1): Th= '6', TaskId= '1'
DONE
ff(2): Th= '6', TaskId= '1'
fAsync(2): Th= '9', TaskId= ''
Т.е. асинхронная операция выполняется в отдельном потоке (6). А завершается (тело метода после await) в основном (9).
Как это так получается?
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main(1): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
fAsync();
Console.WriteLine("DONE");
Console.ReadKey();
}
private static async void fAsync()
{
Console.WriteLine("fAsync(1): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
await ff();
Console.WriteLine("fAsync(2): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
}
private static Task ff()
{
Task t = new Task(() =>
{
Console.WriteLine("ff(1): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
Thread.Sleep(5000);
Console.WriteLine("ff(2): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
});
t.Start();
return t;
}
}
private void button1_Click(object sender, EventArgs e)
{
Debug.WriteLine("Main(1): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
fAsync();
Debug.WriteLine("DONE");
}
private static async void fAsync()
{
Debug.WriteLine("fAsync(1): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
await ff();
Debug.WriteLine("fAsync(2): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
}
private static Task ff()
{
Task t = new Task(() =>
{
Debug.WriteLine("ff(1): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
Thread.Sleep(5000);
Debug.WriteLine("ff(2): Th= '{0}', TaskId= '{1}'", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
});
t.Start();
return t;
}