Задачи в проблеме C# - аргумент не передан правильно в цикле for [дубликат] ⇐ C#
-
Anonymous
Задачи в проблеме C# - аргумент не передан правильно в цикле for [дубликат]
У меня есть метод, в котором необходимо выполнить несколько вызовов службы и консолидировать результат. Я пытался использовать для этого Task, но результаты были неправильными, поэтому я провел два теста ниже.
Использование задач
List задачи = новый List(); Секундомер секундомер = новый секундомер(); секундомер.Старт(); для (int я = 0; я { длинный запуск = секундомер.ElapsedMilliсекунды; Случайное ожидание = новый Random(); int ждал = wait.Next(500, 3000); Thread.Sleep(ждал); return string.Format("Индекс #{0} начался с {1}мс и ждал {2}мс", i, начал, ждал); })); } Task.WaitAll(tasks.ToArray()); foreach (задача Task в задачах) { Console.WriteLine(string.Format("[Задача {0,2}] {1}", Task.Id, Task.Result)); } Использование параллельного подхода
Секундомер stopwatch = новый секундомер(); секундомер.Старт(); int[] inputs = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 } ; Parallel.ForEach(входные данные, я => { длинный запуск = секундомер.ElapsedMilliсекунды; Случайное ожидание = новый Random(); int ждал = wait.Next(500, 3000); Thread.Sleep(ждал); string result = string.Format("Задача {0,2} стартовала через {1} мс и ждала {2} мс", i, запустилась, подождала); Console.WriteLine(результат); }); секундомер.Стоп(); Console.WriteLine("Общее затраченное время: " + секундомер.ElapsedMilliсекунды.ToString()); Как вы можете видеть ниже, индекс задачи все время печатается как 20 (хотя были переданы значения от 0 до 19). Кроме того, параллельная обработка занимает больше времени, чем выполнение задач. Ниже приведены результаты. Очевидно, я делаю что-то не так в Задачах и не могу понять, что именно:(
Вывод задачи
[Задача 1] Индекс №20 начался с 0 мс и ждал 875 мс [Задача 2] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 3] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 4] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 5] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 6] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 7] Индекс № 20 начинался с 855 мс и ждал 1 477 мс. [Задача 8] Индекс № 20 начинался с 886 мс и ждал 1965 мс. [Задание 9] Индекс № 20 начинался с 886 мс и ждал 1965 мс. Параллельный вывод
Задача 6 началась в 1046 мс и ждала 636 мс Задача 11 началась в 1561 мс и ждала 758 мс. Задача 0 началась в 16 мс и ждала 2891 мс. Задача 5 началась на 16 мс и ждала 2891 мс. Задача 15 началась в 17 мс и ждала 2891 мс. Задача 1 началась в 17 мс и ждала 2891 мс. Задача 10 началась в 17 мс и ждала 2891 мс. С реальным методом я столкнулся с той же ситуацией, когда последний элемент возвращается несколько раз, а не отдельные результаты.
Было бы очень полезно, если бы вы могли направить меня в правильном направлении.
Примечание: результаты являются частичными. Фактический результат содержит по 20 элементов каждый.
У меня есть метод, в котором необходимо выполнить несколько вызовов службы и консолидировать результат. Я пытался использовать для этого Task, но результаты были неправильными, поэтому я провел два теста ниже.
Использование задач
List задачи = новый List(); Секундомер секундомер = новый секундомер(); секундомер.Старт(); для (int я = 0; я { длинный запуск = секундомер.ElapsedMilliсекунды; Случайное ожидание = новый Random(); int ждал = wait.Next(500, 3000); Thread.Sleep(ждал); return string.Format("Индекс #{0} начался с {1}мс и ждал {2}мс", i, начал, ждал); })); } Task.WaitAll(tasks.ToArray()); foreach (задача Task в задачах) { Console.WriteLine(string.Format("[Задача {0,2}] {1}", Task.Id, Task.Result)); } Использование параллельного подхода
Секундомер stopwatch = новый секундомер(); секундомер.Старт(); int[] inputs = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 } ; Parallel.ForEach(входные данные, я => { длинный запуск = секундомер.ElapsedMilliсекунды; Случайное ожидание = новый Random(); int ждал = wait.Next(500, 3000); Thread.Sleep(ждал); string result = string.Format("Задача {0,2} стартовала через {1} мс и ждала {2} мс", i, запустилась, подождала); Console.WriteLine(результат); }); секундомер.Стоп(); Console.WriteLine("Общее затраченное время: " + секундомер.ElapsedMilliсекунды.ToString()); Как вы можете видеть ниже, индекс задачи все время печатается как 20 (хотя были переданы значения от 0 до 19). Кроме того, параллельная обработка занимает больше времени, чем выполнение задач. Ниже приведены результаты. Очевидно, я делаю что-то не так в Задачах и не могу понять, что именно:(
Вывод задачи
[Задача 1] Индекс №20 начался с 0 мс и ждал 875 мс [Задача 2] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 3] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 4] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 5] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 6] Индекс № 20 начинался с 0 мс и ждал 875 мс. [Задача 7] Индекс № 20 начинался с 855 мс и ждал 1 477 мс. [Задача 8] Индекс № 20 начинался с 886 мс и ждал 1965 мс. [Задание 9] Индекс № 20 начинался с 886 мс и ждал 1965 мс. Параллельный вывод
Задача 6 началась в 1046 мс и ждала 636 мс Задача 11 началась в 1561 мс и ждала 758 мс. Задача 0 началась в 16 мс и ждала 2891 мс. Задача 5 началась на 16 мс и ждала 2891 мс. Задача 15 началась в 17 мс и ждала 2891 мс. Задача 1 началась в 17 мс и ждала 2891 мс. Задача 10 началась в 17 мс и ждала 2891 мс. С реальным методом я столкнулся с той же ситуацией, когда последний элемент возвращается несколько раз, а не отдельные результаты.
Было бы очень полезно, если бы вы могли направить меня в правильном направлении.
Примечание: результаты являются частичными. Фактический результат содержит по 20 элементов каждый.
Мобильная версия