|
async
|
|||
---|---|---|---|
#18+
имеем следующее: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
из нюансов: в подавляющем большинстве случаев процесс обработки надо будет прерывать где-то в начале последовательности someValues. Т.е. реальной необходимости в создании сразу кучи тасков точно нет. Чего хочется: 1? хочется как-то не шибко заморочно балансировать нагрузку, например, чтоб не более 4х тредов. 2? как бы так извернуться, чтобы таски создавались с учетом балансировки, т.е. по мере необходимости. 3? сделать все это так, чтобы не вывалиться за пределы возможностей non-async метода. за помощь буду очень признателен.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2014, 23:53 |
|
async
|
|||
---|---|---|---|
#18+
RubinDm, Parallel.ForEach (или .AsParallel) + maxdegreeofparallelism ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2014, 23:58 |
|
async
|
|||
---|---|---|---|
#18+
Или Parallel.Invoke + массив actions ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2014, 00:10 |
|
async
|
|||
---|---|---|---|
#18+
А вот тут рецепт, как раскочегарить Task.WaitAll http://codearticles.ru/articles/2503 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2014, 00:14 |
|
async
|
|||
---|---|---|---|
#18+
ок, помогло, всем спасибо. Но, что характерно, возник более глобальный вопрос - как регулировать нагрузку в общем случае? Поясню: есть необходимость в написании конвеера. Конвеер состоит из этапов, на каждом из которых расчитывается массив значений (или IEnumerable, как угодно) с упором на результаты расчетов предыдущего этапа. При этом, для старта расчетов очередного этапа далеко не всегда необходимы прям все данные с предыдущего этапа. В простейшем случае, для расчета N-го значения очередного этапа вполне достаточно N-го значения от предыдущего этапа. Хочется сбалансировать систему так, чтобы: 1. расчеты на всех этапах паралелились 2. очередной этап расчетов стартовал сразу после того, как все необходимые для него данные от предыдущих этапов получены. 3. более старшие этапы получали бы приоритет доступа к CPU выше, чем младшие этапы. Смысл в том, то данные с конечного этапа конвеера отражаются на терминале, и оператор кровно заинтересован не в том, чтобы все значения на всех этапах посчитались, а в том, чтобы как можно быстрее узреть на терминале хоть что-нибудь из выхлопа с конечного этапа расчетов (результаты с промежуточных этапов оператору и вовсе не нужны). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 05:17 |
|
async
|
|||
---|---|---|---|
#18+
Вот тут рецепт http://codearticles.ru/articles/2492 Делаешь необходимый расчет для следующей задачи в ContinueWith и идешь в следующую параллель. В следующей параллели запускаешь новый тред - и в нем заканчиваешь "предыдущую задачу", а в текущем контексте выполняешь снова ту задачу, которую придется добить в следующей ContinueWith. Тем самым у тебя получится комбинация нескольких ContinueWith, в которых помимо текущего контекста будут отдельные вызовы потоков для добивания предыдущих задач. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 13:02 |
|
|
start [/forum/topic.php?fid=20&fpage=102&tid=1402233]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 137ms |
0 / 0 |