Передача элементов массива в потоки - 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();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д