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

Глобальная переменная не меняет значение в Асинхронном методе

31.12.2018, 14:19. Показов 4338. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла следующая проблема:

У меня есть асинхронный метод где я считываю данные из БД, есть событие и его обработчик (Загрузка Формы), есть глобальная переменная COUNT, есть массив структуры где будут храниться добавленные элементы

В асинхронном методе предполагается подсчёт элементов через переменную COUNT, которые подходили под условия и были добавлены в массив (Собственно, для работы с массивом COUNT и была добавлена).

Что происходит в отладчике:

1)Вызывается обработчик Form_load();

2)В нём вызывается мо

Добавлено через 9 минут
2)В нём вызывается мой асинхронный метод

3)Внутри происходит подключение к БД и логика добавления считанных из неё элементов в массив, при добавлении COUNT инкриментируется.

4)По завершении метода имеем: объекты в массиве, а так же ненулевой COUNT

5)После выхода из метода: COUNT = 0, Массив обнуляется. При этом меня почему то на выходе не выбрасывает обратно в обработчик событий, а просто выбрасывает в программу, хотя далее в нём ещё вызывается метод.



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

Как с этим быть? Что делать? (Нет, просто постоянно вставлять этот кусок кода не выйдет во все методы, так как он очень большой и таких методов много)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.12.2018, 14:19
Ответы с готовыми решениями:

Глобальная переменная
как переменную сделать глобальное(т.е. можно было использовать на другой форме)

Глобальная переменная
Ку всем как сделать запись в глобальную переменную. Код: namespace ConsoleApplication5 { class Program { ...

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

10
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.12.2018, 14:23
Цитата Сообщение от Alex_fmv Посмотреть сообщение
Как с этим быть? Что делать?
В 248-й строчке посмотрите (это намек).
0
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 89
31.12.2018, 14:44  [ТС]
Как то несильно помогло:

C#
1
   //top_limit = Convert.ToInt32(top_pos.Text);

Интуитивно разложил три числа(248) в такой ряд:

2 + 2^(n+1)

Я прав?
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
31.12.2018, 14:49
Цитата Сообщение от Alex_fmv Посмотреть сообщение
Как то несильно помогло:
Это было не решение, а НАМЁК на то, что не видя Вашего кода невозможно сказать где в этом коде ошибка.
Выложите код!
0
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 89
31.12.2018, 15:03  [ТС]
Хорошо, вот некоторые фрагменты кода:


Глобальная область класса (объявление переменных, в том числе и проблемной):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public partial class Form1 : Form
    {
 
        bool IsShowPeople, IsShowAnimals, IsShowCountries; //Необходимые переменные
        int show_type;
        bool point_find;
        int down_limit, top_limit;
 
 
        int sort_type;
        string text_task;
 
        public int COUNT;                  //Переменная СOUNT
        SqlConnection sqlConnection;
 
        string connectionSting = @"connection string";
 
       
        public Element[] Elements = new Element[999]; //Массив Элементов, Elements - структура


Обработчик событий (Загрузка формы):

C#
1
2
3
4
5
private void Form1_Load(object sender, EventArgs e)
        {
            OrganizeList(); //Тот самый метод
            ShowList(); //Метод, в котором мы выводим данные из массива Elements
        }



Асинхронный метод:

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
public async void OrganizeList() 
        {
            await sqlConnection.OpenAsync();
            SqlDataReader sqlDataReader = null;
            SqlCommand sqlCommand = new SqlCommand("SELECT * FROM[PERSONS]", sqlConnection); //Открываем подключение к БД
 
            COUNT = 0; //Приравниваем COUNT к 0
            
 
            try
            {
                sqlDataReader = await sqlCommand.ExecuteReaderAsync();
 
                int counter = 0;
 
               
 
                int ID;                            //Временные данные tmp-переменные
                string nm;
                int tp;
                int rat;
                DateTime bth;
                Image img;
 
 
                bool isadd = true;      //Проверка на то, нужно ли добавлять элемент в массив или нет
 
                while (await sqlDataReader.ReadAsync())
                {
                    ID = Convert.ToInt32(sqlDataReader["Id"]);
                    nm = Convert.ToString(sqlDataReader["Name"]);
                    tp = Convert.ToInt32(sqlDataReader["Type"]);
                    rat = Convert.ToInt32(sqlDataReader["Rating"]);
                    bth = Convert.ToDateTime(sqlDataReader["Bithday"]);
 
                    using (var stream = sqlDataReader.GetStream(sqlDataReader.GetOrdinal("Photo")))
                    {
                           img = new Bitmap(Image.FromStream(stream));
                    }
 
                   
 
                    if (rat < down_limit || rat > top_limit) //Далее идёт логика проверки всех параметров, считанных из БД
                    {
                        isadd = false;
                    }
 
                    switch (tp)
                    {
                        case 0:
                            isadd = IsShowPeople;
                            break;
 
                        case 1:
                            isadd = IsShowAnimals;
                            break;
 
                        case 2:
                            isadd = IsShowCountries;
                            break;
                    }
 
                    if (isadd) //Если флаг так и остался true, мы добавляем элемент в массив
                    {
                        Elements[counter].Id = ID;
                        Elements[counter].Name = nm;
                        Elements[counter].type = tp;
                        Elements[counter].Rating = rat;
                        Elements[counter].Bithday = bth;
                        Elements[counter].Photo = img;
                        COUNT++; //Переменная COUNT увеличивается
                    }
 
 
                }
            }
 
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
 
            finally
            {
                if (sqlDataReader != null)
                    sqlConnection.Close();
                    sqlDataReader.Close();
            }
 
            //  SortMianList();
 
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.12.2018, 17:22
Две вещи, которые бросаются в глаза:
1. Криво построена асинхронность. Почему метод ShowList вызывается еще до завершения работы OrganizeList, если для его работы нужен массив, который заполняется в асинхронном методе?
2. С большой вероятностью вы создаете один экземпляр Form1, а переменную потом проверяете в другом экземпляре.

Покажите код создания формы и места, в котором получается нулевое значение переменной COUNT.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
31.12.2018, 17:36
Цитата Сообщение от Alex_fmv Посмотреть сообщение
Обработчик событий (Загрузка формы):
C#
1
2
3
4
5
private void Form1_Load(object sender, EventArgs e)
        {
            OrganizeList(); //Тот самый метод
            ShowList(); //Метод, в котором мы выводим данные из массива Elements
        }
Такой способ годится только для однопоточного выполнения. При ассинхроном вызове OrganizeList во время выполнения ShowList Вы получите пустой массив.
0
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 89
03.01.2019, 16:44  [ТС]
И как же быть в таком случае?
Вызывать ShowList() изнутри асинхронного метода?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.01.2019, 17:26
Цитата Сообщение от Alex_fmv Посмотреть сообщение
И как же быть в таком случае?
1:
C#
1
public async Task OrganizeList()
2:
C#
1
2
3
4
5
private async void Form1_Load(object sender, EventArgs e)
        {
            await OrganizeList(); //Тот самый метод
            ShowList(); //Метод, в котором мы выводим данные из массива Elements
        }
0
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 89
03.01.2019, 18:21  [ТС]
Благодарю, сейчас нет возможности проверить из за другой проблемы связанной с БД.

(Странно, сам предлагает исправление и подсвечивает зелёным вызов метода OrganizeList(), намекая на await, однако при его написании ругается, говорит мол метод должен быть async и с типом Task, хотя это итак уже сделал)

Добавлено через 39 минут
Всё равно, не получается.
Не пойму как это исправить, он ведь сам предлагает добавить await, а потом на него и ругается.
Модификатор async добавлен, тип изменён на Task, что ещё нужно для счастья?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.01.2019, 19:25
Цитата Сообщение от Alex_fmv Посмотреть сообщение
что ещё нужно для счастья?
Показать исправленный код!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2019, 19:25
Помогаю со студенческими работами здесь

Глобальная переменная string
Как сделать переменную string, которая бы работала во всех формах? Допустим я на родительской форме создаю string text...

глобальная переменная в консоле
namespace md5easyTest { class Program { public int i = 1; public static int iAll = 12660805; ...

Глобальная переменная: Реализация через класс
Имею прогу из 2-х форм. Создал класс, в нем обьявил переменные, что бы считвать число из TextBox с формы №1 в переменную num1, а затем...

Глобальная переменная или передача параметра всем классам
В программе достаточно много классов, какие-то объекты создаются внутри других объектов и т.д. В проекте задействованы базы данных (их...

Глобальная переменная после вызова функции меняет значение
До flag = 0; odnorod_pril(buffer1); После int odnorod_pril(char *buffer) { flag точно равен 1, проверял в памяти и просто...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru