@estry

Как запустить код в многоптоке?

Привет!
Есть класс Portizan, в нем метод GoAsync, В котором вызываются асинхронные методы. Пример:
class Portizan
    {
        void Method()
        {
            Random rnd = new Random();
            int wait = rnd.Next(10000, 25000);
            Console.WriteLine($"Будет идти {wait} мс");
            System.Threading.Thread.Sleep(wait);
        }

        async Task MethodAsync()
        {
            await Task.Run(() => Method());
            Console.WriteLine($"Вызвал метод MethodAsync");

        }

        public async Task GoAsync()
        {
            //await SetVarAsync();
            //await SetGunAsync();
            await MethodAsync();
        }
    }


А метод GoAsync Вызывается из другого класса:
class Test
    {
        public async Task ZgorAsync()
        {
            for (int i = 0; i < 10; i++)
            {
                new Thread(async () =>
                {
                    Portizan portizan = new Portizan();
                    await portizan.GoAsync();
                }).Start();
            }

            //Console.ReadLine();
        }
    }


Как из метода ZgorAsync вызвать метод GoAsync в многопотоке и при этом чтобы выполнялось ожидание всех потоков?
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
А что значит "в многопотоке"?

А по тому, что понял, у вас много излишнего кода.
Task.Run
и так будет выполнен в отдельном потоке

Отдавайте созданный таск наружу
class Portizan
    {
        void Method()
        {
            Random rnd = new Random();
            int wait = rnd.Next(10000, 25000);
            Console.WriteLine($"Будет идти {wait} мс");
            System.Threading.Thread.Sleep(wait);
        }

        Task MethodAsync()
        {
            var task = Task.Run(() => Method());
            Console.WriteLine($"Вызвал метод MethodAsync");
            return task;
        }

        public Task GoAsync()
        {
            return MethodAsync();
        }
    }

Только
Thread.Sleep // не лучшее решение для вашей задачи, так как заблокирует поток из пула потоков.

И конечное ожидание будет
class Test
    {
        public async Task ZgorAsync()
        {
            var tasks = Enumerable.Range(0, 10)
                              .Select((x) => {
                                   Portizan portizan = new Portizan();
                                   return portizan.GoAsync();
                               })
                              .ToArray();
            await Task.WaitAll(tasks);
        }
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@estry Автор вопроса
Отдавать созданный созданный таск наружу я не могу, так как в методе GoAsync вызывается не один метод, а несколько. Как быть в таком случае?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Across Systems Новосибирск
До 180 000 ₽
СМАРТ-СОФТ Волгоград
от 60 000 до 90 000 ₽
Технология Екатеринбург
от 60 000 до 150 000 ₽