Научно-образовательный IT-форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Последовательный вызов асинхронных методов (задач) на C#


[+] Последовательный вызов асинхронных методов (задач) на C#

Сообщений 1 страница 2 из 2

1

Асинхронный метод может содержать множество выражений await. Когда система встречает в блоке кода оператор await или вызов метода GetAwaiter, то выполнение в вызывающем потоке останавливается, пока не завершится вызываемая задача. После завершения задачи управление переходит к следующему оператору await и снова метод DisplayResultAsync ждет, когда завершится задача. Это позволяет вызывать задачи последовательно в определенном порядке, что бывает необходимо, если одна задача зависит от результатов другой. Перепишите программу таким образом, чтобы результаты работы функции DisplayResultAsync можно было получить в основном методе Main посредством вызова DisplayResultAsync().GetAwaiter().GetResult().

Код:
using System;
using System.Threading.Tasks;
namespace ConsoleApplication
{
    class Program
    {
        static async Task<int> FactorialAsync(int x)
        {
            int result = 1;
            return await Task.Run(() =>
            {
                for (int i = 2; i <= x; i++)
                {
                    result *= i;
                }
                return result;
            });
        }
        static async Task DisplayResultAsync()
        {
            int num = 5;
            int result = await FactorialAsync(num);
            Console.WriteLine("Факториал числа {0} равен {1}", num, result);
            num = 6;
            result = FactorialAsync(num).GetAwaiter().GetResult();
            Console.WriteLine("Факториал числа {0} равен {1}", num, result);
            num = 7;
            result = await Task.Run(() =>
            {
                int res = 1;
                for (int i = 2; i <= num; i++)
                {
                    res *= i;
                }
                return res;
            });
            Console.WriteLine("Факториал числа {0} равен {1}", num, result);
        }
        static void Main(string[] args)
        {
            DisplayResultAsync().GetAwaiter();
            Console.ReadLine();
        }
    }
}

2

РЕШЕНИЕ:

Код:
using System;
using System.Threading.Tasks;
namespace ConsoleApplication
{
    class Program
    {
        static async Task<int> FactorialAsync(int x)
        {
            int result = 1;
            return await Task.Run(() =>
            {
                for (int i = 2; i <= x; i++)
                {
                    result *= i;
                }
                return result;
            });
        }
        static async Task<int []> DisplayResultAsync()
        {
            int[] m = new int[3];
            int num = 5;
            m[0] = await FactorialAsync(num);
            //Console.WriteLine("Факториал числа {0} равен {1}", num, result);
            num = 6;
            m[1] = FactorialAsync(num).GetAwaiter().GetResult();
            //Console.WriteLine("Факториал числа {0} равен {1}", num, result);
            num = 7;
            m[2] = await Task.Run(() =>
            {
                int res = 1;
                for (int i = 2; i <= num; i++)
                {
                    res *= i;
                }
                return res;
            });
            //Console.WriteLine("Факториал числа {0} равен {1}", num, result);
            return m;
        }
        static void Main(string[] args)
        {
            int[] m = DisplayResultAsync().GetAwaiter().GetResult();
            foreach (int v in m)
                Console.WriteLine(v);
            Console.ReadLine();
        }
    }
}



Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Последовательный вызов асинхронных методов (задач) на C#