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

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

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


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


[+] Асинхронные методы, async и await на C#

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

1

В программе определен метод, возвращающий объект Task – задачу, которая выполняется асинхронно. И так как мы получаем факториал целого числа, то объект задачи типизирован типом int. Сам факториал мы получаем в асинхронном методе DisplayResultAsync. Асинхронным он является потому, что он объявлен с модификатором async и содержит использование ключевого слова await. По негласным правилам в названии асинхронных методов принято использовать суффикс Async. И так как метод FactorialAsync возвращает не просто число int, а объект асинхронной задачи Task<int>, то мы можем его вызвать с ключевым словом await, как в данном случае. Await-метод уже возвращает непосредственный результат. И в методе Main мы вызываем этот асинхронный метод. Однако, если у нас асинхронная задача выполняется довольно приличное время, то мы можем не дождаться окончания ее выполнения, щелкнуть на любую клавишу и выйти из программы. Модифицируйте программный код таким образом, чтобы дождаться завершения работы асинхронного вызова.

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

2

РЕШЕНИЕ:

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



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