41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
1

Почему Task выводит одинаковые значения?

22.09.2018, 13:38. Показов 2238. Ответов 9
Метки нет (Все метки)

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
            Task outer = Task.Factory.StartNew(() =>      // внешняя задача
            {
                List<Task<string>> M = new List<Task<string>>();
                for (int i = 0; i < 80; i++)
                {
                    M.Add(Task<string>.Factory.StartNew(() => check(i.ToString()) ));
 
                    
                }
 
                for(int i=0; i < M.Count; i++)
                {
                    string rrr = M[i].Result;
                    this.Invoke((MethodInvoker)delegate ()
                    {
                        textBox1.Text += rrr;
                    });
                }
            });
 
private string check(string asd)
        {
            int num = jq++;
            string th = Thread.CurrentThread.ManagedThreadId.ToString();
            this.Invoke((MethodInvoker)delegate ()
            {
                textBox1.Text += (num).ToString() + "Start in Thread: " + th + " asd:" + asd + Environment.NewLine;
            });
            Thread.Sleep(5000);
            return (num).ToString() + "Stop in Thread: " + th + Environment.NewLine;
        }
Здравствуйте форумчане. Вопрос такой, почему , когда запускается данный код, я получаю вот такой вывод, хотя передаю i при создании нового task каждый раз разный

HTML5
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
1Start in Thread: 4 asd:3
2Start in Thread: 7 asd:3
3Start in Thread: 6 asd:3
4Start in Thread: 5 asd:3
5Start in Thread: 9 asd:5
6Start in Thread: 8 asd:5
7Start in Thread: 12 asd:6
8Start in Thread: 15 asd:10
9Start in Thread: 11 asd:10
10Start in Thread: 16 asd:12
11Start in Thread: 14 asd:12
12Start in Thread: 19 asd:12
11Start in Thread: 13 asd:12
13Start in Thread: 10 asd:16
14Start in Thread: 21 asd:16
15Start in Thread: 17 asd:16
16Start in Thread: 18 asd:20
17Start in Thread: 23 asd:21
19Start in Thread: 22 asd:21
18Start in Thread: 27 asd:21
20Start in Thread: 24 asd:21
21Start in Thread: 20 asd:21
22Start in Thread: 25 asd:24
23Start in Thread: 26 asd:25
24Start in Thread: 30 asd:26
25Start in Thread: 28 asd:27
26Start in Thread: 34 asd:28
27Start in Thread: 33 asd:32
28Start in Thread: 35 asd:32
29Start in Thread: 36 asd:32
30Start in Thread: 31 asd:32
31Start in Thread: 32 asd:37
32Start in Thread: 29 asd:37
34Start in Thread: 39 asd:40
36Start in Thread: 43 asd:40
33Start in Thread: 37 asd:40
35Start in Thread: 40 asd:40
37Start in Thread: 42 asd:40
38Start in Thread: 46 asd:40
39Start in Thread: 44 asd:45
40Start in Thread: 51 asd:45
41Start in Thread: 47 asd:50
42Start in Thread: 45 asd:50
46Start in Thread: 57 asd:61
44Start in Thread: 52 asd:54
45Start in Thread: 41 asd:55
43Start in Thread: 38 asd:52
48Start in Thread: 49 asd:72
49Start in Thread: 55 asd:72
47Start in Thread: 54 asd:72
50Start in Thread: 50 asd:80
51Start in Thread: 53 asd:80
52Start in Thread: 60 asd:80
53Start in Thread: 63 asd:80
54Start in Thread: 61 asd:80
55Start in Thread: 56 asd:80
56Start in Thread: 58 asd:80
57Start in Thread: 65 asd:80
58Start in Thread: 67 asd:80
59Start in Thread: 64 asd:80
61Start in Thread: 59 asd:80
62Start in Thread: 48 asd:80
60Start in Thread: 68 asd:80
63Start in Thread: 74 asd:80
65Start in Thread: 66 asd:80
64Start in Thread: 62 asd:80
67Start in Thread: 72 asd:80
66Start in Thread: 69 asd:80
68Start in Thread: 71 asd:80
70Start in Thread: 70 asd:80
69Start in Thread: 76 asd:80
71Start in Thread: 75 asd:80
72Start in Thread: 78 asd:80
73Start in Thread: 73 asd:80
74Start in Thread: 81 asd:80
75Start in Thread: 77 asd:80
76Start in Thread: 82 asd:80
77Start in Thread: 83 asd:80
78Start in Thread: 80 asd:80
79Start in Thread: 79 asd:80
1Stop in Thread: 4
2Stop in Thread: 7
4Stop in Thread: 5
3Stop in Thread: 6
5Stop in Thread: 9
6Stop in Thread: 8
7Stop in Thread: 12
8Stop in Thread: 15
9Stop in Thread: 11
10Stop in Thread: 16
11Stop in Thread: 13
11Stop in Thread: 14
12Stop in Thread: 19
13Stop in Thread: 10
15Stop in Thread: 17
14Stop in Thread: 21
16Stop in Thread: 18
21Stop in Thread: 20
19Stop in Thread: 22
18Stop in Thread: 27
17Stop in Thread: 23
20Stop in Thread: 24
22Stop in Thread: 25
23Stop in Thread: 26
24Stop in Thread: 30
25Stop in Thread: 28
26Stop in Thread: 34
27Stop in Thread: 33
32Stop in Thread: 29
29Stop in Thread: 36
28Stop in Thread: 35
30Stop in Thread: 31
33Stop in Thread: 37
31Stop in Thread: 32
34Stop in Thread: 39
36Stop in Thread: 43
43Stop in Thread: 38
35Stop in Thread: 40
39Stop in Thread: 44
37Stop in Thread: 42
38Stop in Thread: 46
40Stop in Thread: 51
45Stop in Thread: 41
44Stop in Thread: 52
41Stop in Thread: 47
42Stop in Thread: 45
46Stop in Thread: 57
49Stop in Thread: 55
51Stop in Thread: 53
47Stop in Thread: 54
48Stop in Thread: 49
50Stop in Thread: 50
52Stop in Thread: 60
54Stop in Thread: 61
56Stop in Thread: 58
55Stop in Thread: 56
53Stop in Thread: 63
61Stop in Thread: 59
58Stop in Thread: 67
62Stop in Thread: 48
59Stop in Thread: 64
60Stop in Thread: 68
57Stop in Thread: 65
64Stop in Thread: 62
65Stop in Thread: 66
63Stop in Thread: 74
68Stop in Thread: 71
70Stop in Thread: 70
67Stop in Thread: 72
71Stop in Thread: 75
69Stop in Thread: 76
66Stop in Thread: 69
75Stop in Thread: 77
73Stop in Thread: 73
79Stop in Thread: 79
72Stop in Thread: 78
77Stop in Thread: 83
74Stop in Thread: 81
76Stop in Thread: 82
78Stop in Thread: 80
Видно, что asd иногда не тот, который был передан..

Добавлено через 11 минут
если сделать например так, то код прекрасно работает..
C#
1
2
3
4
5
6
7
for (int i = 0; i < 80; i++)
                {
                    int qqq = i;
                    M.Add(Task<string>.Factory.StartNew(() => check(qqq.ToString()) ));
 
                    
                }
Но все же почему происходит то, что происходит в коде выше?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2018, 13:38
Ответы с готовыми решениями:

Task.Factory.StartNew выводит одинаковые числа
for (int i = 0; i &lt;= 20; i++) { ...

Почему при наследовании метода из базового класса получаются одинаковые значения?
столкнулся с такой проблемой. Есть два класса: Player и Dealer, оба наследуют от класса Hand,...

Почему htmlAgilityPack возвращает одинаковые значения?
Здравствуйте! Может глупый вопрос, но я не пойму, почему у меня парсит сайт и находит нужные...

Цикл выводит одинаковые значения в массиве
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double...

9
906 / 663 / 318
Регистрация: 23.10.2016
Сообщений: 1,538
22.09.2018, 13:52 2
В первом случае у вас одна-единственная логическая переменная i. Во втором же, 80 различных логических переменных с именем qqq.
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
22.09.2018, 14:00  [ТС] 3
TopLayer, но я же создаю такси в цикле, разве он не должен дожидаться создания такска, а только потом переходить к следующей итерации?
0
906 / 663 / 318
Регистрация: 23.10.2016
Сообщений: 1,538
22.09.2018, 14:02 4
MakcPletnev, он дожидается. У вас таска: вывести значение переменной i. А переменная i - одна. Когда таски начнут выполнятся они будут работать с одной и той же переменной.
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
22.09.2018, 16:18  [ТС] 5
TopLayer, int это разве ссылочный тип? в функцию передается не копия int переменной?
0
Эксперт .NET
6269 / 3897 / 1567
Регистрация: 09.05.2015
Сообщений: 9,188
22.09.2018, 16:29 6
Про замыкания переменных вы конечно не слышали?
0
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
22.09.2018, 16:30  [ТС] 7
Someone007, нет) Так и называется? Замыкание переменных?
0
906 / 663 / 318
Регистрация: 23.10.2016
Сообщений: 1,538
22.09.2018, 17:13 8
Лучший ответ Сообщение было отмечено MakcPletnev как решение

Решение

Цитата Сообщение от MakcPletnev Посмотреть сообщение
int это разве ссылочный тип? в функцию передается не копия int переменной?
О ссылках заботится компилятор. В следующем примере компилятор по сути преобразовывает код класса Test1 в код класса Test2.
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
class Test1
{
    public void Run()
    {
        for (int i = 0; i < 10; i++)
        {
            Task.Run(() => Console.WriteLine(i));
        }
    }
}
 
class Test2
{
    private class Helper
    {
        public int i;
        
        public void WriteNumber()
        {
            Console.WriteLine(i);
        }
    }
    
    public void Run()
    {
        var helper = new Helper();
        for (helper.i = 0; helper.i < 10; helper.i++)
        {
            Task.Run((Action)helper.WriteNumber);
        }
    }
}
1
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.09.2018, 05:57 9
Лучший ответ Сообщение было отмечено MakcPletnev как решение

Решение

MakcPletnev, потому что замыкание на мутабельную переменную. Нужно понимать, что таски не запускаются на выполнение сразу, а сначала шедулятся на выполнение, а потом выполняются. К моменту начала выполнения цикл скорее всего закончится и все они будут ссылаться на единственное значение 80. Подобронее тут: https://habr.com/post/141270/
1
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
23.09.2018, 11:05  [ТС] 10
Спасибо всем за объяснение)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2018, 11:05
Помогаю со студенческими работами здесь

Почему не вводятся 2 одинаковые значения в поле - не ключе?
Срочно! Ключевое поле одно - &quot;Ключ&quot; (не &quot;№ зачётки&quot;)... По смыслу видно, что нужно вводить...

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

Почему метод identityHashCode возвращает одинаковые значения для двух объектов-оберток Integer от 0 до 127
Недавно была ситуация в работе, случайно сравнивал Integer с Integer через знак &quot;==&quot;, а не через...

Почему выводит адреса, а не значения? Это часть программы
Лабораторная работа, должны выводиться значения массива, но выводятся адреса

Почему программа выводит сообщение на одной строке а запрос ввода значения на другой?
Всем добрый день. Подскажите пожалуйста нубу, почему программа выводит сообщение на одной строке а...

Почему программа выдает одинаковые значения при обычном запуске и разные при пошаговом выполнении?
почему когда компилирую программу, в двух массивах значения всегда одинаковые... Однако, если...


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

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

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