C# дросселирование для цикла

Исходная ситуация

Я занимаюсь разработкой.NET Framework 4.0, C#, Winform Application. Приложение перечислит (и протестирует) операции WebServiceOperations в GridView (в настоящее время 60 DataRows => WebServiceOperations).

Задача

Я должен проверить / вызвать все эти операции одним нажатием на кнопку. Каждая операция создает новый экземпляр класса. В этом классе я вызываю асинхронную операцию WebServiceOperation и жду результата. Результат затем подтверждается. Весь код работает гладко, используя делегаты и события.

Теперь дело доходит до проблемы / вопроса: при нажатии на эту кнопку я использую цикл for (int i = 0; i с другими словами, в настоящее время я запускаю 60 операций над ними ' В то же время ' => Сервер получает перегруженную обработку 60 запросов одновременно, и я получаю тайм-ауты. Поэтому мне нужно как-то ограничить количество одновременных запросов, скажем, 10 одновременно. Учтите, что цикл for (где я должен ставить запросы в очередь) находится не в том же потоке, что и метод (событие process_result), где я удаляю запросы из очереди. Я попробовал это, используя ConcurrentQueue, так как этот тип коллекции, кажется, потокобезопасен.

связи

ConcurrentQueue на MSDN

пример кода действительно поможет!

--- это мое решение / пример кода ---

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Concurrent;
using System.Threading;

namespace ConcurrentQueueSample
{
    class Program
    {
        static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(3);

        static void Main(string[] args)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Interval = 1234;
            timer.Enabled = true;
            timer.Start();

            for (int i = 0; i < 10; i++) new Thread(go).Start(i);
        }

        static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            semaphoreSlim.Release();
        }

        static void go(object i)
        {
            Console.WriteLine("id: {0}", i);
            semaphoreSlim.Wait();
            Console.WriteLine("id: {0} is in", i);
            Thread.Sleep(1250);
            Console.WriteLine("id: {0} left!", i);
        }
    }
}

1 ответ

Решение

Возможно, вы захотите взглянуть на использование класса SemaphoreSlim для регулирования потоков, имеющих доступ к вашей очереди.

Другие вопросы по тегам