Синхронизация нескольких экземпляров одного и того же приложения c# - PullRequest
0 голосов
/ 13 июля 2020

У меня есть несколько экземпляров одного и того же приложения, которые запускаются одновременно и работают в течение равного периода времени (почти). Каждое приложение использует задачи для параллельного программирования внутри них. Теперь я хочу ограничить количество параллельных задач, которые могут выполняться в этих экземплярах приложения. Как мне это сделать? Я пробовал использовать семафор. Но не повезло. Допустим, у меня запущено 5 экземпляров приложения. Первый экземпляр создает семафор и удерживает его в течение n секунд. Оставшиеся четыре экземпляра ждут n секунд, и это нормально. Но по прошествии этих n секунд первый экземпляр выходит, я думаю, удаляя экземпляр семафора. После этого остальные 4 начинают выполняться параллельно. Пожалуйста, помогите.

Мой код будет выглядеть примерно так:

static void Main(string[] args)
    {
        List<string> itemList = GetItemList();
        Semaphore throttler = new Semaphore(2, 2, "MySemaPhore");

        foreach (var item in itemList)
        {
            throttler.WaitOne();
            Task.Run(() =>
            {
                try
                {
                    DoWork(item);
                }
                finally
                {
                    throttler.Release();
                }
            });
        }
    }

1 Ответ

3 голосов
/ 13 июля 2020

В вашем коде есть ошибка: вы должны использовать (0, 2) для конструктора семафора. Первый аргумент 0 означает, что изначально заняты ресурсы 0.

Это можно увидеть на официальной странице документации. https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphore?view=netcore-3.1. Особенно строка "_pool = new Semaphore (0, 3);" в примере кода. Если вы хотите go глубже в программировании, вы должны начать привычку читать (хотя бы бегло листать) официальную страницу документации любого используемого вами класса.

Теперь это исправленный код:

   static void Main(string[] args)
   {
    List<string> itemList = GetItemList();
    Semaphore throttler = new Semaphore(0, 2, "MySemaPhore");

    foreach (var item in itemList)
    {
        throttler.WaitOne();
        Task.Run(() =>
        {
            try
            {
                DoWork(item);
            }
            finally
            {
                throttler.Release();
            }
        });
    }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...