2016-10-05 4 views
0

Рассматривают У меня есть следующий код:Пустой массив при использовании NextBytes

public sealed class SimpleRandomProvider : IRandomProvider 
{ 
    private static readonly Lazy<Random> RandomHolder = new Lazy<Random>(() => new Random()); 

    public void NextBytes(byte[] buffer) 
    { 
     RandomHolder.Value.NextBytes(buffer); 
    } 
} 

К сожалению, каждый раз, когда я называю NextBytes в System.Randombuffer заполняется пустыми байтами:

Screen cast

Что странно , сначала X (около 100) звонков NextBytes работает просто отлично.

Что происходит? Может быть, это ошибка в .Net Core?

Код, который вызывает генерации:

do 
{ 
    randomProvider.NextBytes(bytes); 
    bytes[bytes.Length - 1] &= 0x7F; 
    result = new BigInteger(bytes); 
} while (result >= maxExclusive || result.Equals(BigInteger.One) || 
      result.Equals(BigInteger.Zero)); 

Он используется для генерации BigInteger ниже указанных maxExclusive. Этот сниппета не называется 100-200 раз, прежде чем он начинает генерировать буфер, заполненный нулями (во время модульного теста).

Edit:

вы можете скачать мой проект: https://github.com/pwasiewicz/big-prime-number - затем запустить тест - он должен разрушаться из-за InvalidOperationException, выбрасываемого только тогда, когда буфер пуст.

Когда тесты запускаются один за другим. Но запуск их всех (Run All in VS) вызывает исключение.

+2

Попробуйте показывать содержимое этого массива каким-либо другим способом, как вручную преобразовать его в строку или что-то и проверки этого. У визуализатора отладчика есть некоторые ошибки, это может быть один из них. –

+0

К сожалению - нет. Я проверил это - я попытался преобразовать его в строку и проверить его с помощью LINQ: 'var isEmpty = buffer.All (v => v == 0);'. Ед. Тесты не проходят - я написал тест, заполняющий буфер, пока он не содержит ненулевой номер. – pwas

+2

Ваш код отлично работает для меня –

ответ

2

Оказалось, что многопоточный доступ к NextBytes была проблема:

private static readonly Lazy<Random> RandomHolder = new Lazy<Random>(() => new Random()); 
private static readonly object Access = new object(); 

public void NextBytes(byte[] buffer) 
{ 
    lock (Acces) 
     RandomHolder.Value.NextBytes(buffer); 
} 
Смежные вопросы