Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 25.05.2016
Сообщений: 7

Задачи Task

01.02.2018, 18:54. Показов 1199. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, имеется такой вот код, который распараллеливает выполнение задач на три "ветви" по одной мы делаем частотный словарь букв, по другой слов, по третьей словосечетаний. Соль проблемы заключается в последних строках. Можно ли как-то упростить(сократить) код для создания и запуска каждой из задачи? И если можно, то как?

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.IO;
 
namespace Count_of_char_in_text
{
    class Program
    {
 
        static public void bukvi()
        {
 
            string text = System.IO.File.ReadAllText(@"C:\Users\Арвел\OneDrive\Documents\doki\Мистические похождения Шурика.txt", Encoding.Default);
            Regex regex = new Regex(@"(\w)", RegexOptions.IgnoreCase);
            MatchCollection matches = regex.Matches(text);
 
            var result = from Match ch in matches
                         group ch by ch.Value into cha
                         select new { instance = cha.Key, instanceCount = cha.Count() };
            StreamWriter csv = new StreamWriter("BUKVI.csv", false, System.Text.Encoding.GetEncoding(1251)); // Win-кодировка
 
            foreach (var item in result)
            {
                csv.WriteLine((item.instance + ";" + item.instanceCount));// это детали. разделитель ; может быть другим
            }
            csv.Close();
            
 
 
 
        }
 
        static public void slovosochetaniya()
        {
            string s = System.IO.File.ReadAllText(@"C:\Users\Арвел\OneDrive\Documents\doki\Мистические похождения Шурика.txt", Encoding.Default);
            Regex regex = new Regex(@"(\w+\s\w*)", RegexOptions.IgnoreCase);
            MatchCollection matches = regex.Matches(s);
            if (matches.Count > 0) //если найдено хоть одно слово
            {
                //linq запрос для группировки словаря, т.е. частотного анализа
                var query = from Match word in matches
                            group word by word.Value into g
                            select new { Word = g.Key, Count = g.Count() };
                if (query != null) //если запрос вернул хоть какие то данные
                {
                    StreamWriter csv = new StreamWriter("slovosochetaniya.csv", false, System.Text.Encoding.GetEncoding(1251)); // Win-кодировка
 
                    foreach (var word in query)
                    {
                        csv.WriteLine((word.Word + ";" + word.Count));// это детали. разделитель ; может быть другим
                    }
                    csv.Close();
 
                }
            }
        }
        static public void slova()
        {
            string s = System.IO.File.ReadAllText(@"C:\Users\Арвел\OneDrive\Documents\doki\Мистические похождения Шурика.txt", Encoding.Default);
            Regex re = new Regex(@"(\b\w+\b)", RegexOptions.IgnoreCase);
            MatchCollection matches = re.Matches(s);
            if (matches.Count > 0) //если найдено хоть одно слово
            {
                //linq запрос для группировки словаря, т.е. частотного анализа
                var query = from Match word in matches
                            group word by word.Value into g
                            select new { Word = g.Key, Count = g.Count() };
                if (query != null) //если запрос вернул хоть какие то данные
                {
 
                    StreamWriter csv = new StreamWriter("slova.csv", false, System.Text.Encoding.GetEncoding(1251)); // Win-кодировка
 
                    foreach (var word in query)
                    {
                        csv.WriteLine((word.Word + ";" + word.Count));// это детали. разделитель ; может быть другим
                    }
                    csv.Close();
                }
            } }
 
        static void Main(string[] args)
        {
            Task task = new Task(bukvi);
            task.Start();
            Task task1 = new Task(slova);
            task1.Start();
            Task task2 = new Task(slovosochetaniya);
            task2.Start();
            Console.ReadLine();
        }
 
    } }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2018, 18:54
Ответы с готовыми решениями:

Ошибка в отмене задачи (Task)
Доброго времени суток) На данный момент изучаю многопоточность, а именно отмена выполнения задач (Task). Так вот, есть пример, по...

Убить все потоки с помощью отдельной задачи (Task)
Подскажите запускаю я в отдельном потоке Tasks = new Task(() => { while(true) ...

Task.WhenAll для разных типов Task
Здравствуйте! Есть код вида SomeType a = await SomeTask; OtherType b = await OtherTask; //other code Как можно эти два await'a...

6
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
01.02.2018, 19:55
Арвел, а что тут упрощать?
Это стандартный код создания и запуска задачи.
1.Можно еще Task.Run (То же самое).
2.Можно создать TaskFactory, в котором настроить параметры выполнения, если задачи однотипные.
3. Или можно создать метод, который принимает массив делегатов и запускает по количеству делегатов задачи. Что по сути тоже самое, что и предыдущий пункт, только поскромнее.
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
private void RunTasks(params Action[] actions)
        {
            foreach(var item in actions)
            {
                Task t = new Task(item);
                t.Start();
            }
        }
 
 
        private void Foo()
        {
 
        }
 
 
        private void Bar()
        {
        }
 
 
        private void Buzz()
        {
 
        }
       // в Main
       RunTasks(Foo,Bar,Buzz);
2
26 / 24 / 17
Регистрация: 10.01.2018
Сообщений: 66
01.02.2018, 19:59
C#
1
2
3
Task.Run(() => { bukvi(); });
Task.Run(() => { slova(); });
Task.Run(() => { slovosochetaniya(); });
0
0 / 0 / 0
Регистрация: 25.05.2016
Сообщений: 7
01.02.2018, 21:50  [ТС]
IamRain, а как это можно реализовать именно через task.factory?
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
01.02.2018, 22:24
Арвел,
C#
1
2
3
4
5
6
7
        private void RunTasks(params Action[] actions)
        {
            foreach (var item in actions)
            {
                Task.Factory.StartNew(item);
            }
        }
1
Эксперт .NET
 Аватар для Rius
13110 / 7668 / 1674
Регистрация: 25.05.2015
Сообщений: 23,380
Записей в блоге: 14
02.02.2018, 06:32
C#
1
2
3
4
private void RunTasks(params Action[] actions)
{
    actions.AsParallel().ForAll(x => x());
}
2
0 / 0 / 0
Регистрация: 25.05.2016
Сообщений: 7
02.02.2018, 23:41  [ТС]
Благодарю, господа. А еще можно собирать все задания во дин список, чтобы потом с ним работать. Например, если мы хотим управлять дополнительными задачами. Как например в этом примитивном примере

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
 static   List<Task> list = new List<Task>();
        static private void RunTasks(params Action[] actions)
        {
           ;
            foreach (var item in actions)
            {
                
                Task tasts = Task.Factory.StartNew(item);
                list.Add(tasts);                    
                    
                    }
 
 
 
        }
    
       
        static void Main(string[] args)
        {
           RunTasks(bukvi, slova, slovosochetaniya);
            var tasks = Task.Factory.ContinueWhenAll(list.ToArray(), final =>
            {
                Console.WriteLine("Запись завершена");
            });
                
            Console.ReadLine();
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2018, 23:41
Помогаю со студенческими работами здесь

Отмена одного Task в массиве Task
Как можно отменить одну задачу в массиве Task? Никак же нельзя передать CancellationTokenSource в массиве?

WebBrowser в Task
Не могу создать объект WebBrowser в Task'e, поскольку он требует STA, который Task, насколько я понял, не поддерживает. Вообще возможно...

Task вызов
Здравствуйте! Сейчас разбираюсь с асинхронностью и тут встал вопрос. есть функция - private static async Task...

Работа с Task
Здравствуйте. Как проверить, завершилась ли задача запущенная с Task? Если не завершилась, то как её прервать?

Отмена Task
Добрый день, у меня очередной вопрос к Гуру..) Есть Таск, который можно отменить извне с помощью CancellationToken. Таском...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru