Ну, для начала я бы сгенерировал их все и затем поместил бы их в пользовательский интерфейс. Я также не стал бы использовать string.IndexOf
, чтобы узнать, есть ли у вас совпадение. Используйте HashSet<string>
:
HashSet<string> codes = new HashSet<string>();
while (codes.Count < 900000)
{
codes.Add(RandomString(8));
}
// Then do what you want with the codes
Вы также не должны устанавливать CheckForIllegalCrossThreadCalls
в значение false. Просто сгенерируйте их все в фоновом режиме и затем используйте Invoke
, чтобы перейти к потоку пользовательского интерфейса для обновления вашего пользовательского интерфейса. Если вы действительно хотите обновить по мере необходимости, вы можете делать это периодически ... хотя я бы не помещал их все в одно текстовое поле.
Далее я бы посмотрел на RandomString
метод. Вам действительно нужно создавать новый RNGCryptoServiceProvider
на каждой итерации? Почему бы не создать его, а затем использовать повторно?
Аналогично, зачем создавать новый HashSet<char>
и звонить ToArray
на каждый звонок ? Похоже, у вас должен быть отдельный класс RandomCodeGenerator
, который помнит:
- Размер кода, который вы генерируете
- Генератор случайных чисел
- Допустимые символы
Это позволит вам избавиться от большого количества работы по настройке на каждой итерации.
Я бы тогда лично создал char[]
нужного размера и просто итерировал, пока вы его не заполнили, а затем создал бы строку из этого ... Я не вижу необходимости в StringBuilder
... но это, вероятно, не вредит тебе.