Информация об изменениях

Сообщение Re[9]: [Этюд] - синхронный vs асинхронный от 29.09.2021 10:58

Изменено 30.09.2021 6:54 Serginio1

Re[9]: [Этюд] - синхронный vs асинхронный
Здравствуйте, Shmj, Вы писали:

S>Так же из этого же метода приходится вызывать синхронные.


S>Что же делать?


S>> Ты внутри задачи которая лонг вызываешь асинхронный код который внутри в итоге и вызывает Thread.Sleep(1000)


S>Предлагайте решение.

Тут и так понятно если ты вызваешь долгий синхронный код, то и работай с ним синхронно.
Асинхронный код не поможет, а только засрет пул потоков. Или выделяй отдельно долгий синхронный метод в Task c LongRunning

В данном случае
 await Task.Factory.StartNew(() =>
                {
                   Thread.Sleep(1000);
                }, TaskCreationOptions.LongRunning);


class Program
    {
        static async Task AsyncMethod(int i)
        {
            await Task.Delay(1); // Много разных асинхронных вызовов...
            await Task.Delay(1);

            // Это убрать нельзя - эмуляция вызова асинхронного метода, который мы изменить не можем.
            //Thread.Sleep(1000);
            await Task.Factory.StartNew(() =>
                {
                   Thread.Sleep(1000);
                }, TaskCreationOptions.LongRu

            Console.WriteLine(i);
        }

        static void Main(string[] args)
        {
            for (int i = 0; i < 1000; i++)
            {
                int iCopy = i;

                // Вариант 2: асинхронный метод отрабатывате медленно (TaskCreationOptions.LongRunning не применяется)
                Task.Factory.StartNew(async () =>
                {
                    await AsyncMethod(iCopy);
                });
            }


            Console.ReadKey();
        }
    }
Re[9]: [Этюд] - синхронный vs асинхронный
Здравствуйте, Shmj, Вы писали:

S>Так же из этого же метода приходится вызывать синхронные.


S>Что же делать?


S>> Ты внутри задачи которая лонг вызываешь асинхронный код который внутри в итоге и вызывает Thread.Sleep(1000)


S>Предлагайте решение.

Тут и так понятно если ты вызваешь долгий синхронный код, то и работай с ним синхронно.
Асинхронный код не поможет, а только засрет пул потоков. Или выделяй отдельно долгий синхронный метод в Task c LongRunning

В данном случае
 await Task.Factory.StartNew(() =>
                {
                   Thread.Sleep(1000);
                }, TaskCreationOptions.LongRunning);


class Program
    {
        static async Task AsyncMethod(int i)
        {
            await Task.Delay(1); // Много разных асинхронных вызовов...
            await Task.Delay(1);

            // Это убрать нельзя - эмуляция вызова асинхронного метода, который мы изменить не можем.
            //Thread.Sleep(1000);
            await Task.Factory.StartNew(() =>
                {
                   Thread.Sleep(1000);
                }, TaskCreationOptions.LongRunning);

            Console.WriteLine(i);
        }

        static void Main(string[] args)
        {
            for (int i = 0; i < 1000; i++)
            {
                int iCopy = i;

                // Вариант 2: асинхронный метод отрабатывате медленно (TaskCreationOptions.LongRunning не применяется)
                Task.Factory.StartNew(async () =>
                {
                    await AsyncMethod(iCopy);
                });
            }


            Console.ReadKey();
        }
    }