Корректная работа нескольких потоков одновременно - 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;
                }               
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.583 из 5
Похожие ответы