c# фоновая многопоточность
От: Tbr  
Дата: 30.06.10 07:11
Оценка:
Есть готовая программа на C#, которая отлично делает с пару десятков разных вычислений, допустим Фибоначчи, Хибоначчи, Цибоначчи...
На форме есть кнопки, которые так и называются: Фибоначчи, Хибоначчи...

При нажатии на кнопку, запускается соответствующий просчет и результаты каждые 1/5 сек выводятся на форму, при нажатии на другую кнопку расчет прерывается и начинают выводиться результаты другой функции. Каждая из функций использует многопоточность и всё это вместе работает шикарно...на 4-ядерном процессоре. Стоит уменьшить количество доступных ядер до 1-2, программа начинает жестко тупить.

Реализация:
кнопка на форме вызывает backgroundWorker, который подготавливает данные и запускает одну из многопоточных функций

//многопоточная функция
double rezultat;//постоянно изменяется в функции fun, а каждые 1/5 сек отсюда выводится на форму
void fun(BackgroundWorker worker){}
void fibonacci(BackgroundWorker worker)
{
...
threads=48;
funcDelegate deleg = new funcDelegate (func);
IAsyncResult[] results2 = new IAsyncResult[threads];
for (int i = 0; i < threads; i++)//цикл перебора всех комбинаций
   results2[i] = deleg .BeginInvoke(worker);

for (int i = 0; i < threads; i++)//получение результатов
   d.EndInvoke(results2[i]);
}


1. Если убрать многопоточность, то все работает шикарно на любом количестве ядер.
2. Если запускать вычисление не в фоне, а результат получать по завершении работы функции то всё так же работает шикарно.
3. Если добавить кнопку "СТОП" и прерывать предыдущее вычисление кнопкой, а потом начинать следующее, то так же всё работает.
4. Если на компьютере 4 ядра, то тоже все прекрасно.

Уже всё перечитал, и про пулы потоков тоже, всё испытал, до чего мозгов хватило.
Посоветуйте, как правильно реализовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.