Background на одном ядре
От: JеS Россия  
Дата: 24.06.11 22:54
Оценка:
Здравствуйте.

У меня такая проблема.Есть консольное приложение с двумя классами Reader и Writer.В каждом классе определен метод run который работает в отдельном потоке. Раньше я создавал потоки в конструкторах так:

threadWriter = new Thread(run);
threadWriter.IsBackground = true;
threadWriter.Start();


И все работало замечательно.Мне настоятельно порекомендовали использовать для этих целей BackgroundWorker. В сам код я никаких изменений не вносил, кроме того что потоки стали создаваться так:

threadReader = new BackgroundWorker();
threadReader.DoWork += run;
threadReader.RunWorkerAsync();


И вроде как ничего не изменилось.Но потом я заметил одно отличие.
Все потоки создаются одновременно обработчиками одного события главного класса.
И если скажем создать 3 объекта Writer и 3 объекта Reader, то раньше они начинали работать одновременно.
Но с переходом на BackgroundWorker потоки вступают в работу с небольшой задержкой т.е сначала работает только один поток потом секунды через две к нему подключается второй (далее они начинают работать вместе как надо) затем секунды через две — третий и т.д.
В конечно итоге приложение начинает работать в нормальном режиме как и планируется.

Тестировал на нескольких одноядерных машинах проблема остается.
Но для двуядерных процессоров такой проблемы не наблюдается, все сразу же работает как надо.

Вопрос следующий. Проблема в том что я что то не так понимаю и не так делаю?
Или же действительно BackgroundWorker медленнее "входит в ритм" и в чем же тогда его преимущества:?
Re: Background на одном ядре
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.06.11 06:40
Оценка:
Здравствуйте, JеS, Вы писали:

А фактические приоритеты у потоков какие?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Background на одном ядре
От: BigObfuscator  
Дата: 25.06.11 11:33
Оценка: 3 (1)
JеS>Но с переходом на BackgroundWorker потоки вступают в работу с небольшой задержкой т.е сначала работает только один поток потом секунды через две к нему подключается второй (далее они начинают работать вместе как надо) затем секунды через две — третий и т.д.

Да, это особенность пула. Попробуйте увеличить минимальное число потоков пула. Если не поможет — сделайте свой пул, или откажитесь от пула вообще.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.