0 / 0 / 0
Регистрация: 06.01.2019
Сообщений: 15
1

Многопоточное

07.08.2019, 08:24. Показов 1095. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, есть код не свой, раскидал в него вывод текста с информацией о потоке. Только изучаю тему, и насколько понял Task.Factory.StartNew() должен создавать новый поток, как и Parallel.ForEach() тоже должен же да?
Насовав повсюду принт текста, у меня итоге везде показывает 1 поток, даже там, где я ожидаю, что должны появляться новые(startNew,foreach). Причем, если обращаться к форме не через invoke.делеегат, то выдает ошибку, о вторичном потоке(но это я хотя бы знаю почему). Может кто прояснить на этом примере почему везде 1 thread показывает.

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
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
 
namespace DataParallelismWithForEach
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
 
        private void btnProcessImages_Click(object sender, EventArgs e)
        {
            this.txtInputArea.Text += string.Format(" Processing on thread {0}", Thread.CurrentThread.ManagedThreadId);
 
            // Start a new "task" to process the files. 
            Task.Factory.StartNew(() =>
            {
                this.Invoke((Action)delegate
                {
                    this.txtInputArea.Text += string.Format(" Processing on thread {0}", Thread.CurrentThread.ManagedThreadId);
                });
 
                ProcessFiles();
            });
        }
 
        private void ProcessFiles()
        {
            // Load up all *.jpg files, and make a new folder for the modified data.
            string[] files = Directory.GetFiles(@"C:\1", "*.jpg",
                SearchOption.AllDirectories);
            string newDir = @"C:\2";
            Directory.CreateDirectory(newDir);
 
            //  Process the image data in a parallel manner! 
            Parallel.ForEach(files, currentFile =>
            {
 
                string filename = Path.GetFileName(currentFile);
                using (Bitmap bitmap = new Bitmap(currentFile))
                {
                    bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
                    bitmap.Save(Path.Combine(newDir, filename));
 
                    this.Invoke((Action)delegate
                    {
                        this.txtInputArea.Text += string.Format(" Processing on thread {0}", Thread.CurrentThread.ManagedThreadId);
                    });
                }
            }
            );
 
            this.Invoke((Action)delegate
            {
                this.txtInputArea.Text += string.Format("Processing on thread {0}", Thread.CurrentThread.ManagedThreadId);
            });
        }
    }
}
Миниатюры
Многопоточное  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2019, 08:24
Ответы с готовыми решениями:

многопоточное вычисление
Как организовать многопоточное вычисление функции (x+5)^(2/3) + abs(x+2)^2 - ln(5*tg(x)) -...

Многопоточное скачивание
Помогите.Как сделать многопоточное скачивание файлов? using System; using...

Многопоточное программирование
Здравствуйте, читал литературу по C# с целью разобраться как сделать многопоточную программу, но...

Многопоточное программирование
Программа выполняется в одном потоке. Есть три обработчика событий. Как сделать так, чтобы каждый...

8
1 / 1 / 0
Регистрация: 17.01.2019
Сообщений: 16
07.08.2019, 11:50 2
я, конечно, могу ошибаться, но Task без await будет выполняться всегда в основном потоке.
да, и других потоков вы не создаете, чтобы они у вас менялись. хотя я могу ошибаться, люди поумней меня поправят ) почитайте про асинхронность и await Task. Может это вам нужно.
1
95 / 74 / 27
Регистрация: 13.08.2018
Сообщений: 203
07.08.2019, 12:54 3
Цитата Сообщение от wildkloun Посмотреть сообщение
Только изучаю тему, и насколько понял Task.Factory.StartNew() должен создавать новый поток, как и Parallel.ForEach() тоже должен же да?
StartNew создает не поток а задачу. А то как эта задача будет работать, зависит от перечисления TaskCreationOptions. По умолчанию TaskCreationOptions = None
1
Эксперт JS
6494 / 3905 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
07.08.2019, 19:39 4
Цитата Сообщение от wildkloun Посмотреть сообщение
Насовав повсюду принт текста, у меня итоге везде показывает 1 поток,
Потому что:
this.Invoke()
Вы пинками заставляете выполняться "рабочему коду" (Action)delegate в потоке пользовательского интерфейса.

Цитата Сообщение от SnufkinJox Посмотреть сообщение
Task без await будет выполняться всегда в основном потоке.
Работа запущенной Task вообще никак не зависит от await.
0
Модератор
Эксперт .NET
15810 / 10965 / 2845
Регистрация: 21.04.2018
Сообщений: 32,181
Записей в блоге: 2
07.08.2019, 20:30 5
Цитата Сообщение от wildkloun Посмотреть сообщение
насколько понял Task.Factory.StartNew() должен создавать новый поток, как и Parallel.ForEach() тоже должен же да?
Цитата Сообщение от SnufkinJox Посмотреть сообщение
Task без await будет выполняться всегда в основном потоке.
Из https://docs.microsoft.com/ru-... mework-4.8
Цитата Task объект обычно выполняется асинхронно в потоке пула потоков

То есть Task не создаёт поток. А использует свободный поток из пула.
0
Эксперт JS
6494 / 3905 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
07.08.2019, 21:03 6
Элд Хасп, там справка тоже как-то коряво написана. Смешали в кучу и устаревший хлам, и новое.

На Хабре ещё на заре советской власти подчеркнули:
mayorovp
13 декабря 2012 в 16:07
Task совершенно не обязательно работает с нитями.
Задачу можно создать при помощи TaskCompletionSource, тогда она не будет требовать отдельной нити для выполнения.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть Task не создаёт поток.
Можно и поднастроить на создание нового потока.
------
Task.Wait() наповал убивает. Хоть бы там отметили, что нельзя использовать.
0
3676 / 2588 / 718
Регистрация: 02.08.2011
Сообщений: 6,959
07.08.2019, 21:16 7
Цитата Сообщение от amr-now Посмотреть сообщение
Хоть бы там отметили, что нельзя использовать.
Почему нельзя? В доках отмечено, что он блокирует текущий поток.

The Wait(Int32) and Wait(TimeSpan) methods block the calling thread until the task finishes or a timeout interval elapses, whichever comes first.
Тем, кто уже давно работает с Task-ами, должно быть известно, что блокирущее ожидание нецелесообразно использовать при написании асинхронного кода. А так, имхо, в доках все указано.
0
Эксперт JS
6494 / 3905 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
07.08.2019, 21:18 8
IamRain, сейчас мы находимся в теме, созданной новичком.
А новичок может и случайно поверить этой странице справки (не докрутив до последней строчки, где ссылка на уже правильную справку)
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
07.08.2019, 21:59 9
Цитата Сообщение от amr-now Посмотреть сообщение
А новичок может и случайно поверить этой странице справки
я так и не понял в каком месте справка обманывает
Цитата Сообщение от amr-now Посмотреть сообщение
(не докрутив до последней строчки, где ссылка на уже правильную справку)
это где вообще?

в этой теме одна ссылка, первое же упоминане Wait по ней сопровождается комментарием о блокировке потока
0
07.08.2019, 21:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2019, 21:59
Помогаю со студенческими работами здесь

Многопоточное приложение
Требуется разработать многопоточное приложение (в качестве средства разработки следует использовать...

Многопоточное грязное чтение
В этом моменте происходит перезапись значения object rad= (object)value; ...

Многопоточное умножение матриц
Всем привет! как создать несколько потоков и передать им параметры, потом остановить и запустить...

Асинхронное vs. Многопоточное программирование
Здравствуйте. Изучая темы многопоточности и асинхронного программирования, у меня возник вопрос. В...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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