BlockingCollection.Add в цикле с ожиданием, занимающим значительно больше времени, чем ожидалось [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 BlockingCollection.Add в цикле с ожиданием, занимающим значительно больше времени, чем ожидалось [дубликат]

Сообщение Anonymous »

Вот самая простая репродукция, которую я мог сделать, иллюстрирующая проблему. Это консольное приложение, которое создает ограниченную BlockingCollection, запускает фоновый поток, который использует элементы из коллекции с помощью TryTake, а затем в цикле добавляет элементы в основной поток. до верхнего предела, например:

Код: Выделить всё

// Measure the time it takes to add items to the collection with one millisecond delay between Adds.
var sw = Stopwatch.StartNew();
for (int i = 0; i < collection.BoundedCapacity; i++)
{
collection.Add(i);
await Task.Delay(millisecondsDelay: 1);
}
sw.Stop();
BoundedCapacity — 1000 элементов, поэтому цикл for не должен занимать больше одной секунды. Однако, как поясняют комментарии в примере кода, затраченное время всегда превышает максимальное ожидаемое время (которое установлено на 2 * миллисекунды BoundedCapacity) - на моей машине под отладчиком время находится в диапазоне 3,2–4 секунды. , а при работе без отладчика время находится в диапазоне 15–16 секунд!
При закомментировании строки await Task.Delay(milliсекундыDelay: 1), программа ведет себя как положено (цикл завершается через несколько миллисекунд).
Я понятия не имею, что здесь происходит. Может ли кто-нибудь объяснить это поведение?
ОБНОВЛЕНИЕ: Это было вызвано моим незнанием того, что разрешение таймера Windows составляет примерно 15 миллисекунд - см. ответ Саймон Кокоурек ниже.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ime-than-e
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»