1000 потоков и почти все время ждут - как лучше
От: Shmj Ниоткуда  
Дата: 06.03.20 08:31
Оценка:
Задача такая. Нужно проверять состояние операций, но чаще чем раз в 5 мин. делать проверку нет смысла. Одновременно в очереди на проверку может быть около 1000 операций.

Одновременно делать более 10 запросов — тоже нет смысла, иначе сервер добавит в бан-лист (ну и вообще ему тяжело будет). Т.е. кроме ожидания, которое не должно отнимать много ресурсов, нужно еще и добавить ограничение в 10 одновременных исполнений (можно в конфиге ограничить, конечно, но хотелось бы программно и не только запросов вообще а конкретно этих запросов).

Примерная идея:

  Скрытый текст
using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp37
{
    class Program
    {
        static async Task Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                int iCopy = i;
                new Thread(() => { DoWork(iCopy); }) {IsBackground = true}.Start();
            }

            Console.ReadLine();
            Console.WriteLine("Hello World!");
        }

        public static void DoWork(int workId)
        {
            while (!HasUpdates(workId))
            {
                Thread.Sleep(1000); // Ждем примерно 5 минут (для тестов - 1 сек.)...
            }

            Console.WriteLine("Work " + workId);
        }

        static readonly SemaphoreSlim SemaphoreSlim = new SemaphoreSlim(10, 10);
        
        public static bool HasUpdates(int workId)
        {
            SemaphoreSlim.Wait();

            bool success;

            // эмулируем проверку, которая занимает время и может быть как успешна так и нет
            {
                Thread.Sleep(1000);

                var random = new Random();
                success = random.Next(1, 5) == 3;
            }

            SemaphoreSlim.Release();

            return success;
        }
    }
}


Какие варианты?
Отредактировано 06.03.2020 8:38 Shmj . Предыдущая версия . Еще …
Отредактировано 06.03.2020 8:37 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.