Привет, сегодня задумался, как в маленький по объему код, запихнуть многопоточность на примере обычной авторизации.
Итак:
Есть очередь:
Код:
public Queue<string> localBankQueue = new Queue<string>();
Есть некая функция для проверки
Код:
public string checkAccount(string login, string password)
{
//Возвращаем либо 1 при валидности, 0 при не валидности
}
Функция, которая добавляет в listBox
Код:
private delegate void AddListBoxItemDelegate(object item);
private void AddListBoxItem(object item)
{
if (this.listBox1.InvokeRequired)
{
this.listBox1.Invoke(new AddListBoxItemDelegate(this.AddListBoxItem), item);
}
else
{
this.listBox1.Items.Add(item);
}
}
Функция, которая берёт аккаунт из очереди и проверяет его
Код:
public void one()
{
while (true)
{
if (localBankQueue.Count != 0)
{
string item = localBankQueue.Dequeue();
AddListBoxItem(checkAccount(item.Split(':')[0], item.Split(':')[1]));
}
else
{
Thread.CurrentThread.Abort();
}
}
}
Сами потоки
Код:
Thread[] currentThreads = new Thread[0];
И подошли к эвенту на кнопке, который приводит в действие все потоки
Код:
for (int x = 0; x < (int)numericUpDown1.Value; x++)
{
currentThreads[x] = new Thread(one);
currentThreads[x].Start();
}
Для теста мы добавим 1 валидный акк в размере 100 штук
Код:
for (int i = 0; i < 100; i++)
{
localBankQueue.Enqueue("XenWorld:mmkmmk");
}
Запускаю 1 поток: всё работает.
Запускаю 5 потоков: работает, но разница еле ощутима.
Запускаю 20 потокв: разницы практически нету.
Где ошибка?
Добавлено через 16 минут
Название темы немного было поковеркано ).