public async Task GeneratePasswordsAsync() { if (this.passwordLength < 8 || this.passwordCount < 1 || this.usableCharacters.Distinct().Count() < 1) { return; } this.generateButtonIsEnabled = false; this.cancelButtonIsEnabled = true; this.passwordGeneratedCount = 0; this.progressMax = this.passwordCount; this.completeIconVisible = false; var generator = new RandomPassword(passwordLength, this.usableCharacters); if (this.useCharacterOver3Kinds && RandomPassword.CalculateCharacterKindCount(this.usableCharacters) >= 3) { generator = generator.CharacterShuoldHaveOverThreeKinds(); } if (this.useUniqueCharacter && this.passwordLength < (this.usableCharacters.Length / 3)) { generator = generator.CharacterShouldNotDuplicate(); } if (this.notStartWithExcelSpecialCharacter && this.passwordLength > 1) { generator = generator.NotStartWithExcelSpecialCharacter(); } this.passwordGeneratedCount = 0; string result = string.Empty; this.generatedPasswordList = string.Empty; string passwordList = string.Empty; this.generatingIsCanceled = false; await foreach (var passwordWithRuby in generator.GeneratePasswordAsync(this.passwordCount)) { passwordList += passwordWithRuby.Password + "\t" + passwordWithRuby.Ruby + "\r\n"; this.passwordGeneratedCount++; if (this.passwordGeneratedCount % 10 == 0) { if (this.generatingIsCanceled) { this.generatingIsCanceled = false; break; } StateHasChanged(); await Task.Delay(10); } } this.generatedPasswordList = passwordList; this.completeIconVisible = true; this.generateButtonIsEnabled = true; this.cancelButtonIsEnabled = false; }