Передача элементов массива в потоки - C#
Формулировка задачи:
Здравствуйте! Мне необходимо реализовать контроль главным потоком работы производных потоков, выполняющих одну задачу. Я решила создать массив статусов и вызывать эту задачу для каждого потока, передавая элемент массива по ссылке, куда поток-исполнитель будет записывать некоторый признак, этот признак потом и будет обрабатывать главный поток. Но столкнулась с проблемой, компилятор выдает ошибку в ходе выполнения кода о том, что индекс находится вне границ. Хотя для первого создаваемого и вызываемого потока задача срабатывает. Я новичок в многопоточности .NET. Не могли бы вы объяснить почему возникает такая ошибка и есть ли метод лучше для решения моей задачи. Спасибо.
Вот код:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace threads_task { delegate void Operation(ref int pr); class Program { static void MyTask(ref int pr) { Console.WriteLine("MyTask() №{0} запущен", Task.CurrentId); /*Какие-то действия*/ pr = 1; } static void Main(string[] args) { Console.WriteLine("Основной поток запущен"); Operation op = new Operation(MyTask); int n = Int32.Parse(Console.ReadLine()); int[] status = new int[n]; Task[] myTasks = new Task[n]; for (int i = 0; i < n; ++i) { Console.WriteLine("Cоздали {0}", i); status[i] = 0; myTasks[i] = new Task(() => op(ref status[i])); myTasks[i].Start(); } Task.WaitAll(myTasks); Console.WriteLine("Основной поток завершен"); Console.ReadLine(); } } }
Решение задачи: «Передача элементов массива в потоки»
textual
Листинг программы
for (int i = 0; i < n; ++i) { int temp = i; Console.WriteLine("Cоздали {0}", i); status[i] = 0; myTasks[i] = new Task(() => op(ref status[temp])); myTasks[i].Start(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д