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 медленнее "входит в ритм" и в чем же тогда его преимущества:?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.