у меня есть эта часть кода
bool hasData = true;
using (Context context = new Context())
{
using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(MAX_THREADS))
{
while (hasData)
{
Message message = context.Database.SqlQuery<Message>($@"
select top(1) * from Message where
( Status = {(int)MessageStatusEnum.Pending} ) or
( Status = {(int)MessageStatusEnum.Paused } and ResumeOn < GETUTCDATE() )
").FirstOrDefault();
if message == null)
{
hasData = false;
}
else
{
concurrencySemaphore.Wait();
tasks.Add(Task.Factory.StartNew(() =>
{
Process(message);
concurrencySemaphore.Release();
}, this.CancellationToken));
}
}
Task.WaitAll(tasks.ToArray());
}
}
И моя функция Process выглядит примерно так
private void Process(Message message)
{
System.Threading.Thread.Sleep(10000);
}
Теперь, если у меня есть только 1 элемент, который я хочу обработать, тогдаобщее время выполнения составляет 10 с, а время выполнения на элемент (1 элемент) составляет 10 с.Например, если у меня есть 10 элементов, выполнение каждого элемента увеличивается до 15-20 секунд.
Я пытался изменить значение MAX_THREADS, но всегда, если в моей очереди более 10 элементов, и запускаюпараллельное выполнение, тогда время выполнения на элемент составляет около 15 секунд.
Чего мне не хватает?