[.NET][async][WinForms]
От: nikda  
Дата: 21.12.16 08:02
Оценка:
Есть консольный проект с использованием 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;
        }
Отредактировано 23.12.2016 3:16 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.