2013-12-09 2 views
0

я заполнение задачи фабрики с задачами что-то вроде этого (псевдокод):задач завод сила больше задач, чтобы начать в начале

private int _taskcounter; 

надреза

var factory = new TaskFactory(); 
for(var i = 0;i<1000;i++) 
    factory.StartNew(() => doWork()); 

надреза

private void doWork(){ 
    Interlocked.Increment(ref _taskcounter); 
    //do some slow I/O work here 
    Interlocked.Decrement(ref _taskcounter); 
} 

, если вы сейчас смотрите _taskcounter, вы можете увидеть
, изначально его начало около 10 заданий , но затем он запускает от 1 до 2 задач/с, пока очередь не закончится.

мелкое очевидное поведение, не так ли?

Мой вопрос:
Есть ли способ заставить фабрику задач начать больше задач с самого начала?

im уже ограничивает максимальное количество запущенных задач вариацией некоторого класса класса msdn для предотвращения чрезмерного потребления памяти.
или что-то не так с этим смешным методом измерения или моим соображением?

его не нужно запускать все работы в разных потоках, иначе я бы не использовал завод
Я только хочу получить выгоду от нерабочего поведения кражи фабрики.

для всего остального, полагаясь на интеллект завода.

+0

Почему именно вы хотите запустить сразу столько задач? Что они делают? Уверены, что выполнение много раз параллельно ускорит процесс? – svick

+0

это определенно будет. Как уже говорилось, это медленные задачи tcp io. Задачи io на 99% ждут ответа аппаратного/сетевого ресурса, поэтому большое влияние оказывает скорость при параллелизации процесса. –

ответ

1

Как я знаю, TaskFactory использует ThreadPool, поэтому вы можете попробовать метод SetMaxThreads. Но на самом деле он предназначен для оптимизации потребления ресурсов. Поэтому я не думаю, что вы получите большую эффективность.

Также вы можете попробовать начать нить вручную с new Thread(), это поможет вам начать много потоков, но agian Я не думаю, что вы получите большую эффективность.

+0

Taskfactory делает именно то, что нужно, но если вы запускаете массивные очереди, для достижения максимальной эффективности требуется более 10 минут. Я только хочу ускорить этот процесс. –

+0

Я не сказал, что нет. Он достигает максимума только через 10 минут из-за его механизма оптимизации. Он не знает, что ждать от программиста множества коротких задач или одной длинной или много длительной задачи (как в вашем случае). Попробуйте использовать 'SetMinThreads', если вы знаете значение. MSDN говорит, что TP создаст этот счетчик потоков. – Tony

+0

плохо попробуйте это. звучит хорошо. Кстати, theadpool никогда не достигает максимума. он будет создавать задачи/потоки до переполнения памяти. его не так умно, как вы ожидали бы –

Смежные вопросы