Корректная работа нескольких потоков одновременно - C#
Формулировка задачи:
Дорогие пользователи возникла проблема...
Мне нужно запустить програму-чекер в многопотоке... Но как там много идёт время выполнения одного потока (много запросов шлётся...)то все потоки шлют на сервер одинаковый запрос с одним и тем же логином и паролем(по 6 раз так как 6 потоков)... мне нужно избежать этого... попробовал через lock(this) всё работает только в 1 потоке... то есть закрыло доступ другим потокам смысла нет... кто то может помочь?
Решение задачи: «Корректная работа нескольких потоков одновременно»
textual
Листинг программы
using System;
using System.Threading;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace ConsoleThreading
{
class Program
{
// Блокирующая очередь. Сюда будут добавляться "логины" из ричбокса и отсюда их будут доставать обрабатывающие потоки
static BlockingCollection<int> queue = new BlockingCollection<int>();
static void Main(string[] args)
{
// Создаем шесть потоков, которые будут заниматься логином
Task[] threads = new Task[6];
for (int i = 0; i < threads.Length; i++) {
int num = i + 1;
threads[i] = Task.Factory.StartNew(() => ProcessQueue("Thread " + num));
}
// Создаем очередь "логинов"
for (int i = 0; i < 100; i++) {
queue.Add(i);
}
// Эта строчка заставит все слушающие потоки разблокироваться, когда в очереди не останется элементов.
// На деле ее надо добавлять при завершении работы приложения - чтобы слушающие потоки не висели бесконечно.
queue.CompleteAdding();
// Ждем окончания работы всех потоков
Task.WaitAll(threads);
Console.WriteLine("All threads finished execution");
Console.ReadLine();
}
// Добавляет элемент в очередь
static void Enqueue(int value)
{
queue.Add(value);
}
// Удаляет и возвращает первый элемент в очереди
static int Dequeue()
{
return queue.Take();
}
// Достает элементы из очереди и обрабатывает их
static void ProcessQueue(object taskName)
{
while (true) {
try {
// Достаем следующий элемент из очереди. Если элементов ноль и свойство очереди IsCompleted = false, поток будет заблокирован пока элементы не появятся.
int item = Dequeue();
// Делаем что нам нужно. В данном случае просто выводим полученный из очереди элемент в консоль. На деле здесь будут обрабатываться логины.
Console.WriteLine("{0}: processing {1}.", taskName, item);
// Допустим, один логин занимает 1 секунду.
Thread.Sleep(1000);
}
catch (InvalidOperationException) {
// Обеспечиваем выход из бесконечного цикла при завершении работы приложения
Console.WriteLine("{0} has finished working", taskName);
return;
}
}
}
}
}