Передача элементов массива в потоки - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Мне необходимо реализовать контроль главным потоком работы производных потоков, выполняющих одну задачу. Я решила создать массив статусов и вызывать эту задачу для каждого потока, передавая элемент массива по ссылке, куда поток-исполнитель будет записывать некоторый признак, этот признак потом и будет обрабатывать главный поток. Но столкнулась с проблемой, компилятор выдает ошибку в ходе выполнения кода о том, что индекс находится вне границ. Хотя для первого создаваемого и вызываемого потока задача срабатывает. Я новичок в многопоточности .NET. Не могли бы вы объяснить почему возникает такая ошибка и есть ли метод лучше для решения моей задачи. Спасибо. Вот код:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Threading;
  7. namespace threads_task
  8. {
  9. delegate void Operation(ref int pr);
  10. class Program
  11. {
  12. static void MyTask(ref int pr)
  13. {
  14. Console.WriteLine("MyTask() №{0} запущен", Task.CurrentId);
  15. /*Какие-то действия*/
  16. pr = 1;
  17. }
  18. static void Main(string[] args)
  19. {
  20. Console.WriteLine("Основной поток запущен");
  21. Operation op = new Operation(MyTask);
  22. int n = Int32.Parse(Console.ReadLine());
  23. int[] status = new int[n];
  24. Task[] myTasks = new Task[n];
  25. for (int i = 0; i < n; ++i)
  26. {
  27. Console.WriteLine("Cоздали {0}", i);
  28. status[i] = 0;
  29. myTasks[i] = new Task(() => op(ref status[i]));
  30. myTasks[i].Start();
  31. }
  32. Task.WaitAll(myTasks);
  33. Console.WriteLine("Основной поток завершен");
  34. Console.ReadLine();
  35. }
  36. }
  37. }

Решение задачи: «Передача элементов массива в потоки»

textual
Листинг программы
  1.             for (int i = 0; i < n; ++i)
  2.             {
  3.                 int temp = i;
  4.                 Console.WriteLine("Cоздали {0}", i);
  5.                 status[i] = 0;
  6.                 myTasks[i] = new Task(() => op(ref status[temp]));
  7.                 myTasks[i].Start();
  8.             }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы