Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
1

Долгое обращение к методу

05.08.2017, 03:10. Показов 1253. Ответов 30

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Имеем два потока: основной и дочерний. В основном потоке происходит некоторая обработка поступаемых данных с помощью метода, дочерний поток получает эти данные и отправляет обрабатываться в основной поток. Во время отправки данных происходит обращение к методу, который производит обработку. Когда происходит первая, самая первая отправка данных и обращение к этому методу, то возникает задержка от 30 до 60 секунд, при чем если проследить по брейк поинтам, то действительно - программа непонятно чем занимается и не сразу обращается к методу. Все последующие обращения к методу происходят без задержек. Метод, к которому идет обращение состоит из 30к строк.

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

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2017, 03:10
Ответы с готовыми решениями:

Обращение к методу в другом потоке
Всем привет, задача следующая: Легче всего объяснить на примере калькулятора. Есть метод,...

Обращение к методу из другой формы
public static void AddDocument() { using (var fs = new...

Обращение к методу, созданному через события формы
Что передавать в качестве параметров при обращении к методу, созданному через события формы? ...

Обращение к методу.
Не могу разобраться, как работать с методами (т.е не только с main). Есть программа, в которой...

30
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
05.08.2017, 03:15 2
К гадалке или телепатам не пробовали обращаться? Думаю данные специалисты как раз по вашей части.

Хотите помощи, показывайте код, и предоставьте больше деталей (что за данные, откуда получаются и т.д.)
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 03:27  [ТС] 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
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
private void GetBid()
        {
            Dictionary<string, string> DictionaryParam = new Dictionary<string, string>();
            List<string> dis = new List<string>();
            string lines = "";
            while (Run)
            {
                Status.Text = "Статус: ОЖИДАНИЕ СВЕЧЕЙ";
                if (File.Exists("OnProject\\candles.txt"))
                {
                    lines = "";
                    try
                    {
                        using (StreamReader myReader = new StreamReader("OnProject\\candles.txt"))
                            lines = myReader.ReadToEnd();
                    }
 
                    catch { }
 
                    if (lines.Length != 0)
                    {
                        Status.Text = "Статус: ОБРАБОТКА";
                        File.Delete("OnProject\\candles.txt");
                        string[] ll = lines.Split('#');
                        string[] gg;
                        for (int i = 0; i < ll.Length - 1; i++)
                        {
                            Status.Text = "Статус: ПОЛУЧЕНИЕ СВЕЧЕЙ";
                            gg = ll[i].Split(';');
 
                            DictionaryParam.Clear();
                            for (int j = 0; j < gg.Length; j++)
                            {
                                string[] KeyValue = gg[j].Split('=');
                                DictionaryParam.Add(KeyValue[0], KeyValue[1]);
                                dis.Add(KeyValue[1]);
                            }
                            highC.Add(Convert.ToDouble(DictionaryParam["H"].Replace('.', ',')));
                            lowC.Add(Convert.ToDouble(DictionaryParam["L"].Replace('.', ',')));
                            openC.Add(Convert.ToDouble(DictionaryParam["O"].Replace('.', ',')));
                            closeC.Add(Convert.ToDouble(DictionaryParam["C"].Replace('.', ',')));
                            LablesAxis.Add(DictionaryParam["T"].ToString().Substring(0, 10) + "\n" + DictionaryParam["T"].ToString().Substring(11));
 
                            if (paramOption == "c")
                            //Происходит обращение к методу который отвечает за обработку инфы
                                DrawingGraphics(DictionaryParam["T"].ToString(), Convert.ToDouble(DictionaryParam["C"].Replace('.', ',')));
                            else if (paramOption == "h")
                                DrawingGraphics(DictionaryParam["T"].ToString(), Convert.ToDouble(DictionaryParam["H"].Replace('.', ',')));
                            else if (paramOption == "l")
                                DrawingGraphics(DictionaryParam["T"].ToString(), Convert.ToDouble(DictionaryParam["L"].Replace('.', ',')));
                            else if (paramOption == "o")
                                DrawingGraphics(DictionaryParam["T"].ToString(), Convert.ToDouble(DictionaryParam["O"].Replace('.', ',')));
                            if (dis[6].ToString() == "1")
                            {
                                updateViewer = true;
                                viewer.updateViewPort(true, false);
                                viewer.updateViewPort(true, false);
                                crossHeairTrigger = true;
                            }
 
                            allCandles++;
                            allCandlesStatus.Text = "Получено свечек: " + allCandles.ToString();
                            Thread.Sleep(1);
                        }
                    }
                }
                Thread.Sleep(1);
            }
        }

Код самого метода предоставить не могу, ибо проект коммерческий, но факт в том, что после обращения из кода выше проходит некоторое время прежде чем это обращение действительно произойдет.
Такая задержка происходит только после первого обращения, дальше все хорошо.
Пробовал обращаться из основного потока, пробовал делать обращение по нажатия кнопки, но результат не менятеся
C#
1
2
3
4
public static void DrawingGraphics(string nt, double prc)
        {
           
        }
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
05.08.2017, 07:52 4
Ну прикольно. Мы читаем файл, обрабатываем строки и удаляем его. А второй раз файла уже нет, обрабатывать нечего и метод быстро завершается. Нормально всё работает.
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 14:55  [ТС] 5
То есть вас не смущает что код обернут в цикл while и работает пока значение флага не поменяют на false? А так же вас скорее всего не смущает что после того как мы обработаем файл, то начинается ожидание следующего файла?

Данный метод работает во вторичном потоке, при помощи цикла while постоянно ожидаем появления файла, после появления файла считываем его и удаляем, затем распиливаем считанный файл по указанному символу и записываем в массив, затем с помощью следующего цикла перебираем полученный массив и каждую его строку сплитим по указанному символу и записываем в другой массив, после происходит снова сплит и запись в коллекцию ключей и значений. Затем раскидывал из этой коллекции с ключами и значениями по другим коллекциям, а затем происходит обращение к методу, и отправка ему параметров.
А вот затем начинается самое интересное - обращение должно происходить мгновенно, но этого не происходит. Проходит некоторое время, прежде чем управление передается методу public static void DrawingGraphics(string nt, double prc).

Происходит такая задержка только при первой итерации цикла
C#
1
2
3
4
for (int i = 0; i < ll.Length - 1; i++)
                        {
                           //.....
                        }
а вот начиная со второй итерации - обращение происходит без каких либо задержек.

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


Все работает правильно, НО после первого обращения - происходит жуткая задержка и программа делает не понятно что.
C#
1
DrawingGraphics(DictionaryParam["T"].ToString(), Convert.ToDouble(DictionaryParam["C"].Replace('.', ',')));
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 15:11  [ТС] 6
На скриншоте два брейк поинта, перед тем как произошло попадание во второй брейк поинт произошла задержка в 25017 мс
Миниатюры
Долгое обращение к методу  
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
05.08.2017, 16:01 7
Обойдите. Создайте 2 переменных локальных, проставьте им значения до входа. И второе, ваш метод рисовальщик может ли ждать чего-то? Попробуйте пошагать входя во все методы/свойства с момента первого брейкпойнта. Может зависает на моменте доставания из словаря.
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 16:07  [ТС] 8
hoolygan, нет, метод рисовальщик ничего не ждет, и между этими двумя брейк поинтами ничего нет.

А вот про зависание на моменте доставания из словаря - расскажи по подробнее, пожалуйста!!!!
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
05.08.2017, 16:14 9
Я только предположил. Теоретически этого быть не должно. Но лучше перепроверить. До запуска метода создай 2 локальных переменных, и впиши значения. Потом запусти метод используя созданные переменные. Чисто для проверки. Там минутное дело.
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 16:17  [ТС] 10
hoolygan, создал, до запуска метода и передал значения - результат такой же. Создал на стадии загрузки формы и передал значения - форма появляется только спустя секунд 30.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
05.08.2017, 16:24 11
А форма тут вообще не при чем. Если метод в отдельном потоке живет - то и фиг с ним, с потоком. Или этот злополучный метод запускается в форме, которая инициализируется еще 30 сек. Тогда я вообще запутался. Какая же тогда логика приложения? Мы же говорим о простом запуске статического метода в том же классе, что и форма, правильно? Тогда пофигу вообще на форму.
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 16:29  [ТС] 12
hoolygan, да, метода в том же классе что и форма..
А может получиться так, что из за громоздкости самого метода возникает такая задержка? Метод рисовальщик включает в себя около 30000 строк.

Добавлено через 2 минуты
hoolygan, и метод рисовальщик живет с основном потоке, а вызывается из вторичного.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
05.08.2017, 16:38 13
Даже интересно стало... попробую поэксперемнтировать. Я в таких случаях всегда делегаты пишу или события, а напрямую никогда так не вызывал. Но теоретически запуск из вторичного не должен зависать, иначе бы зависал всегда, а не только в первый раз. В то, что много строк - тут не сильно тоже думаю, Вы же запускаете IL код для CLR-ки. Попробуйте отследить выделение памяти приложению в момент запуска метода. Может там создаются тысячи тяжелых объектов еще, и это вешает процесс. Хз прям таки.
1
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 16:44  [ТС] 14
hoolygan, а можете подсказать как за памятью последить? использую mvs 2015
0
HF
1163 / 749 / 181
Регистрация: 09.09.2011
Сообщений: 2,314
Записей в блоге: 2
05.08.2017, 16:44 15
А что за метод "DictionaryParam[key]" ? Больше похоже что это там такие задержки. Может быть тяжёлый поиск по словарю или ещё какие-то неправильные алгоритмы.
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 16:52  [ТС] 16
HF, это коллекция ключей и значений
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
05.08.2017, 17:02 17
О памяти Вам доложит диспетчер задач, студия тут ни к чему.
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 19:28  [ТС] 18
hoolygan, да, вы оказались правы, в момент запуска и на протяжении всей задержки, используемый объем оперативной памяти вырастает на 100 Мб, а штатное потребление 20-25 Мб. А используемый процент ресурсов процессора вырастает до 25% со штатных 3%.

Подскажите пожалуйста - в какую сторону глядеть или где искать.

Добавлено через 2 минуты
После того как задержка проходит показатели используемых ресурсов компьютера приходят в норму.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
05.08.2017, 19:48 19
Искать только в 30 тыс строк
А если серьезно, то мы же не знаем, что делает Ваш метод рисования, так что помочь врядли сможем. Если уже завязано всё на этом методе - то нужно выкручиваться с другой стороны, например, показывать какой-то свой красивый WaitControll, чтобы юзер не думал, что всё безудержно висит. Прям не знаю, что и сказать еще можно. Такой метод переделать почти нереально кажется. Но вот програмерам по пальцам постучать реально нужно, и больно. Класс может быть большим, но методы - ну не поверю, что 30 к строк не говнокода там.
0
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 61
05.08.2017, 19:53  [ТС] 20
hoolygan, понимаете, там считается очень много графические элементов и ведется сбор всякой статистики, каждый графический элемент имеет свой алгоритм нахождения, ну и статистика собирается почти по каждому графическому элементу.
0
05.08.2017, 19:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2017, 19:53
Помогаю со студенческими работами здесь

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

Долгое обращение к блокам жесткого диска
Добрый день, пару дней назад купил ЖД (Western Digital Blue WD10EZEX) наблюдались не понятные...

Обращение методу в объекте**
struct SomeProvider { public: void (* someFunc)(); } void...

Обращение к методу string
Подскажите пожалуйста, как обратиться к методу string передаваемой по ссылке в функцию?


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

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