У меня есть локальный класс с методом, используемым для построения списка строк, и я обнаружил, что когда я нажимаю этот метод (в цикле for 1000 раз), он часто не возвращает сумму, которую я запрашиваю.
У меня есть глобальная переменная:
string[] cachedKeys
Параметр, переданный методу:
int requestedNumberToGet
Метод выглядит примерно так:
List<string> keysToReturn = new List<string>();
int numberPossibleToGet = (cachedKeys.Length <= requestedNumberToGet) ?
cachedKeys.Length : requestedNumberToGet;
Random rand = new Random();
DateTime breakoutTime = DateTime.Now.AddMilliseconds(5);
//Do we have enough to fill the request within the time? otherwise give
//however many we currently have
while (DateTime.Now < breakoutTime
&& keysToReturn.Count < numberPossibleToGet
&& cachedKeys.Length >= numberPossibleToGet)
{
string randomKey = cachedKeys[rand.Next(0, cachedKeys.Length)];
if (!keysToReturn.Contains(randomKey))
keysToReturn.Add(randomKey);
}
if (keysToReturn.Count != numberPossibleToGet)
Debugger.Break();
У меня есть приблизительно 40 строк в cachedKeys, длина которых не превышает 15 символов.
Я не эксперт по многопоточности, поэтому буквально просто вызываю этот метод 1000 раз в цикле и последовательно выполняю там отладку.
Машина, на которой он работает, является довольно мощным рабочим столом, поэтому я ожидаю, что время прорыва будет реалистичным, фактически оно случайным образом прерывается в любой точке цикла (я видел 20, 100, 200, 300).
У кого-нибудь есть идеи, где я ошибаюсь?
Редактировать: ограничено .NET 2.0
Редактировать: цель прорыва заключается в том, что если выполнение метода занимает слишком много времени, клиенту (несколько веб-серверов, использующих данные для каналов XML) не придется ждать, пока другие зависимости проекта инициализировать, им просто дадут 0 результатов.
Редактировать: думал, что я опубликую характеристики производительности
Оригинал
- 0,0042477465711424217323710136 '- 10
- '0,0479597267250446634977350473' - 100
- '0,4721072091564710039963179678' - 1000
Скит
- '0,0007076318358897569383818334' - 10
- 0,007256508857969378789762386 '- 100
- 0.0749829936486341141122684587 '- 1000
Фредди Риос
- 0.0003765841748043396576939248 '- 10
- 0,0046003053460705201359390649 '- 100
- '0,0417058592642360970458535931' - 1000