Отмена задачи C# без причины ⇐ C#
-
Anonymous
Отмена задачи C# без причины
Мне нужно проанализировать среднее время взлома паролей различной длины. Я пытаюсь выполнить несколько вычислений параллельно, а затем найти среднее время. В коде есть Console.WriteLine для отслеживания хода выполнения функций. Вот код:
публичный частичный класс SecondTask: Форма { публичная вторая задача() { ИнициализироватьКомпонент(); } частная пустота CountAverageForLength (длина целого числа) { Console.WriteLine(DateTime.Now.TimeOfDay.ToString()); Задача [] задачи = новая Задача [5]; List times = новый List(); Обработчик PasswordTakingTimeHandler = новый PasswordTakingTimeHandler (раз, длина); for (int NumberOfTask = 0; NumberOfTask CountAndAddTimeOfTakingPassword(обработчик)); вернуть новую задачу; } общедоступный статический TimeSpan AverageTime (интервалы IEnumerable) { double doubleAverageTicks = spans.Average(timeSpan => timeSpan.Ticks); длинный longAverageTicks = Convert.ToInt64(doubleAverageTicks); вернуть новый TimeSpan(longAverageTicks); } частная пустота GenerateChartButton_Click (отправитель объекта, EventArgs e) { CountAverageForLength(3); Console.WriteLine("Некоторый текст"); } общедоступная структура PasswordTakingTimeHandler { общедоступный список spanList; общественный int парольдлина; public PasswordTakingTimeHandler (List spanList, int passLength) { this.spanList = spanList; this.passwordLength = passLength; } } }
Вот код PasswordController:
общедоступный класс PasswordController { общедоступная строка? Пароль {получить; частный набор; } общественный ulong AttemptsToTakePassword {get; частный набор; } public void GeneratePassword (длина целого числа) { Пароль = PasswordGenerator.GeneratePasswordWithLength(длина); } общедоступная асинхронная задача AnalyseTimeToTakePasswordAsync (секундомер) { ПопыткиToTakePassword = 0; нить? сгенерированнаяСтрока = ноль; while (generatedString != Пароль) { сгенерированнаяСтрока = Генератор Пароля.СоздатьПарольСДлиной(Пароль.Длина); ПопыткиВзятьПароль++; } секундомер.Стоп(); } общедоступный секундомер AnalyseTimeToTakePasswordSync (секундомер) { ПопыткиToTakePassword = 0; нить? сгенерированнаяСтрока = ноль; while (generatedString != Пароль) { сгенерированнаяСтрока = Генератор Пароля.СоздатьПарольСДлиной(Пароль.Длина); ПопыткиВзятьПароль++; } секундомер.Стоп(); вернуть секундомер; } общедоступный статический класс PasswordGenerator { частная статическая строка _validSymbols = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789"; частный статический Random _rand = новый Random(); частный статический символ GetRandomSymbol => _validSymbols[_rand.Next(_validSymbols.Length)]; частный статический StringBuilder _builder = новый StringBuilder(); общедоступная статическая строка? GeneratePasswordWithLength (длина целого числа) { _builder.Очистить(); for (int index = 0; index < длина; index++) { _builder.AppendFormat(GetRandomSymbol.ToString()); } вернуть _builder.ToString(); } } } Проблема в том, что не все Задачи завершают свою работу даже после длительного ожидания в 5-10 минут (расчеты в одном потоке показывают, что среднее время взлома 3-значного пароля составляет около 1,2 секунды). Это консольный текст после 12 минут работы:
12:43:53.0182256 Начать ждать Нормальный Подсчитанные задачи Немного текста Начал анализировать время Начал анализировать время Начал анализировать время Начал анализировать время Начал анализировать время интервал 00:00:00.0007325 Как можно решить эту проблему?
Я пытался увеличить/уменьшить количество задач, использовал профилировщик для проверки StackOverflow, ничего не помогло
Мне нужно проанализировать среднее время взлома паролей различной длины. Я пытаюсь выполнить несколько вычислений параллельно, а затем найти среднее время. В коде есть Console.WriteLine для отслеживания хода выполнения функций. Вот код:
публичный частичный класс SecondTask: Форма { публичная вторая задача() { ИнициализироватьКомпонент(); } частная пустота CountAverageForLength (длина целого числа) { Console.WriteLine(DateTime.Now.TimeOfDay.ToString()); Задача [] задачи = новая Задача [5]; List times = новый List(); Обработчик PasswordTakingTimeHandler = новый PasswordTakingTimeHandler (раз, длина); for (int NumberOfTask = 0; NumberOfTask CountAndAddTimeOfTakingPassword(обработчик)); вернуть новую задачу; } общедоступный статический TimeSpan AverageTime (интервалы IEnumerable) { double doubleAverageTicks = spans.Average(timeSpan => timeSpan.Ticks); длинный longAverageTicks = Convert.ToInt64(doubleAverageTicks); вернуть новый TimeSpan(longAverageTicks); } частная пустота GenerateChartButton_Click (отправитель объекта, EventArgs e) { CountAverageForLength(3); Console.WriteLine("Некоторый текст"); } общедоступная структура PasswordTakingTimeHandler { общедоступный список spanList; общественный int парольдлина; public PasswordTakingTimeHandler (List spanList, int passLength) { this.spanList = spanList; this.passwordLength = passLength; } } }
Вот код PasswordController:
общедоступный класс PasswordController { общедоступная строка? Пароль {получить; частный набор; } общественный ulong AttemptsToTakePassword {get; частный набор; } public void GeneratePassword (длина целого числа) { Пароль = PasswordGenerator.GeneratePasswordWithLength(длина); } общедоступная асинхронная задача AnalyseTimeToTakePasswordAsync (секундомер) { ПопыткиToTakePassword = 0; нить? сгенерированнаяСтрока = ноль; while (generatedString != Пароль) { сгенерированнаяСтрока = Генератор Пароля.СоздатьПарольСДлиной(Пароль.Длина); ПопыткиВзятьПароль++; } секундомер.Стоп(); } общедоступный секундомер AnalyseTimeToTakePasswordSync (секундомер) { ПопыткиToTakePassword = 0; нить? сгенерированнаяСтрока = ноль; while (generatedString != Пароль) { сгенерированнаяСтрока = Генератор Пароля.СоздатьПарольСДлиной(Пароль.Длина); ПопыткиВзятьПароль++; } секундомер.Стоп(); вернуть секундомер; } общедоступный статический класс PasswordGenerator { частная статическая строка _validSymbols = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789"; частный статический Random _rand = новый Random(); частный статический символ GetRandomSymbol => _validSymbols[_rand.Next(_validSymbols.Length)]; частный статический StringBuilder _builder = новый StringBuilder(); общедоступная статическая строка? GeneratePasswordWithLength (длина целого числа) { _builder.Очистить(); for (int index = 0; index < длина; index++) { _builder.AppendFormat(GetRandomSymbol.ToString()); } вернуть _builder.ToString(); } } } Проблема в том, что не все Задачи завершают свою работу даже после длительного ожидания в 5-10 минут (расчеты в одном потоке показывают, что среднее время взлома 3-значного пароля составляет около 1,2 секунды). Это консольный текст после 12 минут работы:
12:43:53.0182256 Начать ждать Нормальный Подсчитанные задачи Немного текста Начал анализировать время Начал анализировать время Начал анализировать время Начал анализировать время Начал анализировать время интервал 00:00:00.0007325 Как можно решить эту проблему?
Я пытался увеличить/уменьшить количество задач, использовал профилировщик для проверки StackOverflow, ничего не помогло
Мобильная версия