powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / async
7 сообщений из 7, страница 1 из 1
async
    #38806911
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имеем следующее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public async Task SomeJob(SomeType someValue) { ... /* await что-то там */ ... }

public void SimpleNonAsyncProc(IEnumerable<SomeType> someValues)
{
  // someValues на входе содержит множество значений, реально очень много ...
  // someValues фактически массивом не является, т.е. это нечто вычисляемое, возможно даже за дорого ...

  // далее надо как-то по-быстрому натравить SomeJob на все элементы someValues
  // что-то типа:
  var tasks = someValues.Select(SomeJob).ToArray(); // тут таски начинают материализовываться, и это НЕРЕАЛЬНО тупит.
  var superTask = Task.WaitAll(tasks); // непосредственно обработка проходит за вменяемое время.
}


из нюансов: в подавляющем большинстве случаев процесс обработки надо будет прерывать где-то в начале последовательности someValues. Т.е. реальной необходимости в создании сразу кучи тасков точно нет.
Чего хочется:
1? хочется как-то не шибко заморочно балансировать нагрузку, например, чтоб не более 4х тредов.
2? как бы так извернуться, чтобы таски создавались с учетом балансировки, т.е. по мере необходимости.
3? сделать все это так, чтобы не вывалиться за пределы возможностей non-async метода.
за помощь буду очень признателен..
...
Рейтинг: 0 / 0
async
    #38806912
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RubinDm,

Parallel.ForEach (или .AsParallel) + maxdegreeofparallelism
...
Рейтинг: 0 / 0
async
    #38806918
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или Parallel.Invoke + массив actions
...
Рейтинг: 0 / 0
async
    #38806922
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тут рецепт, как раскочегарить Task.WaitAll http://codearticles.ru/articles/2503
...
Рейтинг: 0 / 0
async
    #38807773
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, помогло, всем спасибо. Но, что характерно, возник более глобальный вопрос - как регулировать нагрузку в общем случае? Поясню: есть необходимость в написании конвеера. Конвеер состоит из этапов, на каждом из которых расчитывается массив значений (или IEnumerable, как угодно) с упором на результаты расчетов предыдущего этапа. При этом, для старта расчетов очередного этапа далеко не всегда необходимы прям все данные с предыдущего этапа. В простейшем случае, для расчета N-го значения очередного этапа вполне достаточно N-го значения от предыдущего этапа. Хочется сбалансировать систему так, чтобы:
1. расчеты на всех этапах паралелились
2. очередной этап расчетов стартовал сразу после того, как все необходимые для него данные от предыдущих этапов получены.
3. более старшие этапы получали бы приоритет доступа к CPU выше, чем младшие этапы. Смысл в том, то данные с конечного этапа конвеера отражаются на терминале, и оператор кровно заинтересован не в том, чтобы все значения на всех этапах посчитались, а в том, чтобы как можно быстрее узреть на терминале хоть что-нибудь из выхлопа с конечного этапа расчетов (результаты с промежуточных этапов оператору и вовсе не нужны).
...
Рейтинг: 0 / 0
async
    #38808161
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут рецепт http://codearticles.ru/articles/2492

Делаешь необходимый расчет для следующей задачи в ContinueWith и идешь в следующую параллель. В следующей параллели запускаешь новый тред - и в нем заканчиваешь "предыдущую задачу", а в текущем контексте выполняешь снова ту задачу, которую придется добить в следующей ContinueWith. Тем самым у тебя получится комбинация нескольких ContinueWith, в которых помимо текущего контекста будут отдельные вызовы потоков для добивания предыдущих задач.
...
Рейтинг: 0 / 0
async
    #38811063
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для async-методов есть Task.WhereAll вместо Task.WaitAll.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / async
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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