У меня есть коллекция из 100 000 предметов. Предмет имеет 2 свойства. (1) метка времени и (2) данные. Каждый элемент в коллекции имеет отметку времени, которая на несколько (меняющихся) миллисекунд равна или больше, чем предыдущие элементы. Мне нужно отправить эти элементы в конечную точку TCP, поддерживая задержку между ними. ie, если разница во времени между 1-м и 2-м пунктом составляет 300 мс, то после отправки первого элемента мне следует подождать 300 мс, а затем отправить второй элемент.
После нахождения разницы во времени между последовательными элементами я попытался Thread.Sleep. Для списка с разницей во времени между первым и последним элементом, равным 40 секундам, с Thread.Sleep для отправки всех элементов потребовалось около 70-80 секунд.
DateTime currenTimeStamp;
DateTime nextTimeStamp;
TimeSpan timeDiff;
using (NetworkStream stream = client.GetStream())
{
for (int i = 0; i < count; i++)
{
//some lines here to do the TCP transfer
currenTimeStamp = //get current item's time stamp;
nextTimeStamp = //get next item's time stamp;
timeDiff = nextTimeStamp - currenTimeStamp;
Thread.Sleep(timeDiff);
}
}
Позже я попытался подождать некоторое время l oop, сравнивая текущее время и ожидаемое время отправки. На обработку всех предметов уходило около 50-55 секунд. Также процессор все время занят, пока l oop.
DateTime currenTimeStamp;
DateTime nextTimeStamp;
DateTime TimeToSendNextItem;
TimeSpan timeDiff;
using (NetworkStream stream = client.GetStream())
{
for (int i = 0; i < count; i++)
{
//some lines here to do the TCP transfer
currenTimeStamp = //get current item's time stamp;
nextTimeStamp = //get next item's time stamp;
timeDiff = nextTimeStamp - currenTimeStamp;
TimeToSendNextItem = DateTime.UtcNow.Add(timeDiff);
while (DateTime.UtcNow < TimeToSendNextItem) { }
}
}
Как я могу справиться с этим с минимальной задержкой и эффективно? Под минимальной задержкой я имею в виду отправку этих элементов в течение времени, близкого к исходной разнице во времени между первым и последним элементом, равной 40 секундам.