Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 14
1

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

06.04.2016, 19:12. Показов 2122. Ответов 6

Author24 — интернет-сервис помощи студентам
Здравствуйте! Мне необходимо реализовать контроль главным потоком работы производных потоков, выполняющих одну задачу. Я решила создать массив статусов и вызывать эту задачу для каждого потока, передавая элемент массива по ссылке, куда поток-исполнитель будет записывать некоторый признак, этот признак потом и будет обрабатывать главный поток. Но столкнулась с проблемой, компилятор выдает ошибку в ходе выполнения кода о том, что индекс находится вне границ. Хотя для первого создаваемого и вызываемого потока задача срабатывает. Я новичок в многопоточности .NET. Не могли бы вы объяснить почему возникает такая ошибка и есть ли метод лучше для решения моей задачи. Спасибо.
Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2016, 19:12
Ответы с готовыми решениями:

Фоновые потоки - Найти произведение элементов числового массива
С помощью асинхронных вызовов решить задачу: Найти произведение элементов числового массива Так...

Передача параметра в потоки
Добрый день уважаемые форумчане! Подскажите как правильно сделать передачу параметров в поток. В...

Потоки - передача параметров
Помогите пожалуйста разобраться с потоками. Нужно реализовать передачу параметров с одного потока в...

Передача в метод элементов массива
Есть ли разница между ситуациями, когда в метод, в котором описан формальный параметр типа double,...

6
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
06.04.2016, 19:21 2
Цитата Сообщение от Dianisia Посмотреть сообщение
почему возникает такая ошибка
Потому что у вас происходит захват переменной i, которая на момент выполнения анонимных методов имеет значение n.

C#
1
2
3
4
5
6
7
8
            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();
            }
1
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 14
06.04.2016, 19:58  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Потому что у вас происходит захват переменной i, которая на момент выполнения анонимных методов имеет значение n.
Боже, какая глупость! Спасибо большое Вам!

Скажите, а вообще можно ли назвать мой метод проверки статуса адекватным?)) или лучше придумать что-то другое?
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
06.04.2016, 22:53 4
Цитата Сообщение от Dianisia Посмотреть сообщение
можно ли назвать мой метод проверки статуса адекватным?
Оно же сильно от ситуации зависит: что за метод, как проверяет, как быстро и пр.
Вот что бы я изменил, так это в метод op передавал бы лучше массив и индекс, без всяких ref.
1
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 14
06.04.2016, 23:38  [ТС] 5
kolorotur, ну вот мне просто нужно анализировать в основном потоке некоторый признак, его значение заносит в элемент массива поток-исполнитель, если этот признак удовлетворяет некоторому условию, то основной поток убивает этот поток-исполнитель, создает новый вместо него и отправляет его делать ту же задачу.
Получается, у меня поток-мастер должен постоянно анализировать значение статусов, приходящих от разных исполнителей. Пока только есть идея крутиться в цикле и анализировать значения элементов массива...
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
07.04.2016, 00:34 6
Цитата Сообщение от Dianisia Посмотреть сообщение
мне просто нужно анализировать в основном потоке некоторый признак, его значение заносит в элемент массива поток-исполнитель, если этот признак удовлетворяет некоторому условию, то основной поток убивает этот поток-исполнитель, создает новый вместо него и отправляет его делать ту же задачу.
А почему бы не переложить эту задачу на сам поток-исполнитель?
Пусть сам проверяет этот признак и решает, продолжать работать дальше или закругляться.
0
0 / 0 / 0
Регистрация: 08.12.2014
Сообщений: 14
07.04.2016, 10:44  [ТС] 7
kolorotur,
Цитата Сообщение от kolorotur Посмотреть сообщение
Пусть сам проверяет этот признак и решает, продолжать работать дальше или закругляться.
Да, это, конечно, было бы логичнее. Просто в постановке задаче это действие должен выполнять поток-мастер, вот и приходится извращаться(
0
07.04.2016, 10:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2016, 10:44
Помогаю со студенческими работами здесь

Потоки. Передача функции аргумента
Имеется некоторая функция UserFunction(). Подскажите, как при создании нового потока при помощи...

Потоки, передача файлов по сети
Возник вопрос как передать несколько файлов, при этом количество их при каждой передаче меняется....

Передача аргументов в потоки Windows
Всем доброго времени суток. В C++/C#/Java можно создавать потоки с функциями, принимающими разное...

Передача двух аргументов (потоки )
Есть функция: void renderingThread(sf::RenderWindow* window, Commands *commans) { while...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru