powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Лимит на кол-во парал-х задач
9 сообщений из 9, страница 1 из 1
Лимит на кол-во парал-х задач
    #39836553
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, вечер добрый.
Подскажите, какой способ лучше использовать для ограничения кол-ва одновременно выполняемых задач?
Нашел 2 варианта:
Код: c#
1.
2.
var options = new ParallelOptions { MaxDegreeOfParallelism = 10 };
Parallel.Invoke(options, taskList.ToArray());


и второй вариант это отдельный класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
internal class Tasks
{
    /// <summary>
    /// Starts the given tasks and waits for them to complete. This will run, at most, the specified number of tasks in parallel.
    /// <para>NOTE: If one of the given tasks has already been started, an exception will be thrown.</para>
    /// </summary>
    /// <param name="tasksToRun">The tasks to run.</param>
    /// <param name="maxTasksToRunInParallel">The maximum number of tasks to run in parallel.</param>
    /// <param name="cancellationToken">The cancellation token.</param>
    public static void StartAndWaitAllThrottled(IEnumerable<Task> tasksToRun, int maxTasksToRunInParallel, CancellationToken cancellationToken = new CancellationToken())
    {
        StartAndWaitAllThrottled(tasksToRun, maxTasksToRunInParallel, -1, cancellationToken);
    }

    /// <summary>
    /// Starts the given tasks and waits for them to complete. This will run, at most, the specified number of tasks in parallel.
    /// <para>NOTE: If one of the given tasks has already been started, an exception will be thrown.</para>
    /// </summary>
    /// <param name="tasksToRun">The tasks to run.</param>
    /// <param name="maxTasksToRunInParallel">The maximum number of tasks to run in parallel.</param>
    /// <param name="timeoutInMilliseconds">The maximum milliseconds we should allow the max tasks to run in parallel before allowing another task to start. Specify -1 to wait indefinitely.</param>
    /// <param name="cancellationToken">The cancellation token.</param>
    public static void StartAndWaitAllThrottled(IEnumerable<Task> tasksToRun, int maxTasksToRunInParallel, int timeoutInMilliseconds, CancellationToken cancellationToken = new CancellationToken())
    {
        // Convert to a list of tasks so that we don&#39;t enumerate over it multiple times needlessly.
        var tasks = tasksToRun.ToList();

        using (var throttler = new SemaphoreSlim(maxTasksToRunInParallel))
        {
            var postTaskTasks = new List<Task>();

            // Have each task notify the throttler when it completes so that it decrements the number of tasks currently running.
            tasks.ForEach(t => postTaskTasks.Add(t.ContinueWith(tsk => throttler.Release(), cancellationToken)));

            // Start running each task.
            foreach (var task in tasks)
            {
                // Increment the number of tasks currently running and wait if too many are running.
                throttler.Wait(timeoutInMilliseconds, cancellationToken);

                cancellationToken.ThrowIfCancellationRequested();
                task.Start();
            }

            // Wait for all of the provided tasks to complete.
            // We wait on the list of "post" tasks instead of the original tasks, otherwise there is a potential race condition where the throttler&#39;s using block is exited before some Tasks have had their "post" action completed, which references the throttler, resulting in an exception due to accessing a disposed object.
            Task.WaitAll(postTaskTasks.ToArray(), cancellationToken);
        }
    }
}

//Вызов 
Tasks.StartAndWaitAllThrottled(taskList, 10);


Что скажете по поводу этих решений?
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39836566
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaskScheduler C# или ParallelOptions.MaxDegreeOfParallelism
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39836595
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,

способов дофига. все гуглятся на раз. давайте чё-нибудь конкретное обсудим.

"что скажете?" -- ай маладца. давай конкретику.
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39836718
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСупер_Пав,

способов дофига. все гуглятся на раз. давайте чё-нибудь конкретное обсудим.

"что скажете?" -- ай маладца. давай конкретику.

Для начала подправить бы титул:
"Лим-т на кол-во парал-х з-ч"
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39836769
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesTaskScheduler C# или ParallelOptions.MaxDegreeOfParallelism
Спасибо
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39836770
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинhVosttСупер_Пав,

способов дофига. все гуглятся на раз. давайте чё-нибудь конкретное обсудим.

"что скажете?" -- ай маладца. давай конкретику.

Для начала подправить бы титул:
"Лим-т на кол-во парал-х з-ч"
и вам доброе утро =))
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39837016
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Е-ть ре-ие ч-з С-форы.

https://toster.ru/q/545984
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39837018
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вроде бы MaxDegreeOfParallelism - это настройка для раскидона потоков по процессорам при asParallel, а не ограничение на количество запущенных задач?
...
Рейтинг: 0 / 0
Лимит на кол-во парал-х задач
    #39837022
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

Нет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Лимит на кол-во парал-х задач
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]