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

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


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

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

11   голосов , оценка 4 из 5
Похожие ответы