Задача такая. Нужно проверять состояние операций, но чаще чем раз в 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;
}
}
}
|
| |
Какие варианты?