Передача элементов массива в потоки - 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();
}