Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293

Task и массивы

26.04.2019, 17:28. Показов 4491. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемы программисты! Помогите, пожалуйста, разобраться с новой для меня темой.
Данный метод активирует последовательное произношение 5 предложений.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void Speek(string[] str)
        {
            int j = str.Length;
 
            var outer = Task.Factory.StartNew(() =>      // внешняя задача
            {
                Task[] task1 = new Task[5]
                {
                    new Task(() => Speech(str[0])),
                    new Task(() => Speech(str[1])),
                    new Task(() => Speech(str[2])),
                    new Task(() => Speech(str[3])),
                    new Task(() => Speech(str[4]))
                };
 
                foreach (var t in task1)
                {
                    t.Start();
                    Task.WaitAny(t);
                }
            });
        }

Для простоты передаю массив по нажатию на кнопку

C#
1
2
3
4
5
6
7
8
9
10
11
12
 private void button1_Click(object sender, EventArgs e)
        {
            string[] strings = new string[5];          
            strings[0] = "Новости на канале Пятница совершенно не похожи на традиционные информационные выпуски.";
            strings[1] = "События освещаются исключительно в позитивном ключе, без политики и происшествий";
            strings[2] = "За просмотром передачи Пятница News становится ясно, что наш мир удивителен и скрывает много интересного";
            strings[3] = "Ведущие делают все, чтобы избавить выпуски новостей от штампов и заезженности";
            strings[4] = "В эфире представлены передачи, посвященные моде и стилю жизни";
 
            YandexSpeech YA = new YandexSpeech();
            YA.Speek(strings);
        }
Такой код прекрасно работает, но почему если я пытаюсь поменять в строке Task[] task1 = new Task[5] число 5 на int j = str.length; тут же выдает ошибку "Ошибка CS0150 Требуется постоянное значение." Разве переменной j не присваивается конкретное число, равное длине массива? И, подскажите, как вообще передать в task массив заранее неизвестной длинны?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2019, 17:28
Ответы с готовыми решениями:

Task.FromResult
Ребята проверьте пожалуйста у вас это конструкция работает ? У меня пишет что FromResult не существует в типе Task , хотя она есть . ...

Task и ожидание
Добрый день. Подскажите пожалуйста, как дождаться завершения выполнения всех фоновых задач? bool r = await...

Task в net 4.0
Добрый день. Можно ли использовать Task в проектах Net 4.0? Попробовал имеются проблемы при использовании asunc await. А...

10
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
26.04.2019, 17:54
Лучший ответ Сообщение было отмечено WersaT как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
            string[] strings = new string[]
            {
                "Новости на канале Пятница совершенно не похожи на традиционные информационные выпуски.",
                "События освещаются исключительно в позитивном ключе, без политики и происшествий",
                "За просмотром передачи Пятница News становится ясно, что наш мир удивителен и скрывает много интересного",
                "Ведущие делают все, чтобы избавить выпуски новостей от штампов и заезженности",
                "В эфире представлены передачи, посвященные моде и стилю жизни"
            };
 
            YandexSpeech YA = new YandexSpeech();
            YA.Speek(strings);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    class YandexSpeech
    {
        public void Speek(string[] str)
        {
            Task.Factory.StartNew(() =>
            {
                foreach (var x in str)
                {
                    Speech(x);
                }
            });
        }
 
        public void Speech(string str)
        {
            Console.WriteLine(str);
            Thread.Sleep(1000);
        }
    }
Вообще не указывал никаких размеров массивов... И зачем вам по таску на каждый элемент массива не понятно, они же всё равно по очереди исполняются... а раз так, то они не нужны совсем...
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.04.2019, 17:55
Цитата Сообщение от WersaT Посмотреть сообщение
почему если я пытаюсь поменять в строке Task[] task1 = new Task[5] число 5 на int j = str.length; тут же выдает ошибку "Ошибка CS0150 Требуется постоянное значение."
Потому что вы сразу же пытаетесь инициализировать массив.
Уберите инициализатор.

C#
1
2
3
var task1 = new Task[str.Length];
for (int i = 0; i < task1.Length; i++)
   task1[i] = new Task(() => Speech(str[i]));
1
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
26.04.2019, 20:06  [ТС]
Someone007, огромное Вам спасибо! РАБОТАЕТ!!!
C#
1
И зачем вам по таску на каждый элемент массива не понятно, они же всё равно по очереди исполняются...
Пример брал тут https://metanit.com/sharp/tutorial/12.2.php
0
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
28.04.2019, 13:46  [ТС]
Помогите, пожалуйста, с остановкой этого потока. На том же метаните нашел такой способ, но он не работает. Можно попробовать таск запихнуть в тред и останавливать тред, но по моему, это извращение.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CancellationTokenSource cts = new CancellationTokenSource();    /*останов потока, не работает*/
 
        public void Speek(string[] str)
        {
            Task.Factory.StartNew(() =>
            {
                foreach (var x in str)
                {
                    Speech(x);
                }
 
            }, cts.Token);
            
        }
 
        public void Stop()   /*этот метод вызываю по нажатию кнопки*/
        {
            cts.Cancel();        
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.04.2019, 14:06
C#
1
2
3
4
5
6
                foreach (var x in str)
                {
                    Speech(x);
                    if (cts.Token.IsCancellationRequested)
                       return;
                }
Токен можете так же передавать в метод Speech и там тоже прерывать выполнение.
Если много вложенных вызовов, то вместо добавления проверки на каждом уровне можете просто вызвать ThrowIfCancellationRequested() — он выбросит OperationCancelledException.
1
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
28.04.2019, 16:20  [ТС]
C#
1
2
3
4
5
6
foreach (var x in str)
                {
                    Speech(x);
                    if (cts.Token.IsCancellationRequested)
                       return;
                }
Так просто не сработало, оказывается нужно добавить static (случайно угадал))))
C#
1
static CancellationTokenSource cts = new CancellationTokenSource();
Только сразу возник второй вопрос: после срабатывания cts.Cancel(); второй раз task не запускается. Вроде же должен при повторном вызове метода public void Speek(string[] str) заново создавать task и заново читать текст? Но ничего не происходит

Добавлено через 12 минут
И все равно task останавливается только дождавшись окончания проработки метода speek(x). А каждая итерация этого метода может идти довольно долго. Например песни фоново петь.
Есть ли какой-нибудь метод, который полностью обрубает выполнение этого метода? Ведь при нажатии на кнопку закрытия формы, task обрубает. (С тредом в этом плане сложнее)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.04.2019, 17:34
Цитата Сообщение от WersaT Посмотреть сообщение
оказывается нужно добавить static
Не нужно было.
Нужно было просто передавать необходимый токен в метод.

Цитата Сообщение от WersaT Посмотреть сообщение
второй раз task не запускается
Вот это — результат статика.

Цитата Сообщение от WersaT Посмотреть сообщение
task останавливается только дождавшись окончания проработки метода speek(x)
Там выше же написано:
Цитата Сообщение от kolorotur Посмотреть сообщение
Токен можете так же передавать в метод Speech и там тоже прерывать выполнение.
CancellationToken сам по себе ничего не прерывает — это всего лишь признак отмены.
Прерывание вы реализуете сами.
1
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
28.04.2019, 19:35  [ТС]
Нужно было просто передавать необходимый токен в метод.
Я передаю, ну по крайней мере я так думаю. cts.Token - в конце таска. А без статика вообще не работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public void Speek(string[] str)
        {
            Task.Factory.StartNew(() =>
            {
                foreach (var x in str)
                {
                    Speech(x);
                    if (cts.Token.IsCancellationRequested)
                        return;
                }
 
            }, cts.Token);   
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.04.2019, 19:44
WersaT, передавайте его в метод speek как аргумент. В точке вызова.
0
6 / 4 / 3
Регистрация: 23.10.2010
Сообщений: 293
28.04.2019, 19:44  [ТС]
а если добавить
CancellationToken token = cts.Token();
выдает ошибку "Ошибка CS0236 Инициализатор поля не может обращаться к нестатическому полю, методу или свойству "YandexSpeech.cts"."
(YandexSpeech - название класса)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.04.2019, 19:44
Помогаю со студенческими работами здесь

Принцип работы Task
static void Main(string args) { var task = Task.Factory.StartNew(() =&gt; { ...

Отмена async Task
Хочу: 1) запускать асинхронный метод = ok 2) выводить в textbox процесс работы = ok 3) ждать завершения работы = ok 4) после...

Task List Windows
Никто не знает как получить список задач Windows? (TaskList) Заранее спасибо. :)

Task.WhenAny by some condition
Добрый день всем, хотелось бы узнать ваше мнение, есть ли возможность сделать whenany по условию.. Например что бы whenany завершался, если...

Как запустить Task в Thread
Есть метод который должен работать в потоке и вне потока. var regionId = comboItems.Value; Thread myNewThread = new Thread(()...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru