Я работаю над своим университетским проектом. Одним из основных требований является использование multithreading
(пользователь может выбирать номера тем).Threadpool issue Использование C#
Я новичок в C# и на основе интернет-исследований. Я выбираю ThreadPool
.
Я провел много времени, наблюдая за тем, как потоки действуют с использованием параллельных часов в VS, и я не знаю, как это работает. Например, threadNumber = 10
, но параллельные часы показывают только 4 активированные нити.
Вот мой код:
public void calculateBeta()
{
var finished = new CountdownEvent(1);
for (int i = 0; i < threadNumber; i++)
{
finished.AddCount();
ThreadPool.QueueUserWorkItem(
(state) =>
{
try
{
doSth();
}
finally
{
finished.Signal();
}
});
}
finished.Signal();
finished.Wait();
}
Что я делаю неправильно? Я попытался проверить этот код со многими различными значениями числа потоков, и он не работал, как я и искал.
EDIT:
private void myTask(object index)
{
int z = (int)index;
double[] result = countBeta(createTableB(z), createTableDiagonalA(z));
int counter = 0;
if ((rest != 0) && (z == threadNumber - 1))
{
for (int j = z * numbersInRow; j < (z + 1) * numbersInRow + rest; j++)
{
N[j] = result[counter];
counter++;
}
}
else
{
for (int j = z * numbersInRow; j < (z + 1) * numbersInRow; j++)
{
N[j] = result[counter];
counter++;
}
}
threads[z] = true;
}
public void calculateBeta()
{
N = new double[num];
setThreadNumber(2);
checkThreadNumber();
setNumberInRow();
setRest();
threads = new bool[threadNumber];
for (int i = 0; i < threadNumber; i++)
{
Thread thread = new Thread(this.myTask);
thread.IsBackground = true;
thread.Start(i);
}
while (!checkThreads())
{
}
}
private bool checkThread()
{
bool result = true;
for (int i = 0; i < threads.Length; i++)
{
if (!threads[i])
result = false;
}
return result;
}
static void Main(string[] args)
{
Jacobi jacobi = new Jacobi();
Console.WriteLine("Metoda Jacobiego");
Console.WriteLine("Rozwiazywanie ukladu n-rownan z n-niewiadomymi Ax=b");
jacobi.getNum();
jacobi.getA();
jacobi.getB();
jacobi.calculateBeta();
jacobi.calculateM();
jacobi.calculateX();
jacobi.countNorms();
Console.ReadLine();
}
Мне нужны результаты от calculateBeta для дальнейших расчетов. Иногда потоки еще не закончены, но программа движется вперед без данных, которые должны предоставляться потоками. Теперь я использую переменную bool, но это решение не является изящным способом справиться с этим (создание таблицы bool, проверка наличия всех потоков) Как я могу управлять этим по-другому?
Пул потоков не будет создавать слишком много потоков. – SLaks
Как долго длится 'doSth'? Я немного объяснил о threadpool [здесь] (http://stackoverflow.com/a/26141323/2530848). Это может помочь. –
Это уже очень хорошо покрыто. Просто google "как работает .net threadpool?" и начните читать сверху. –