Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для 0LyBmW2DEE
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 11
.NET 2.x

Метод - Application.DoEvents();

17.05.2016, 16:23. Показов 2802. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть такой метод: Application.DoEvents(); - Обрабатывает все сообщения Windows, которые в данный момент находятся в очереди сообщений.

Создаем консольное приложение
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
        static void Main(string[] args)
        {
            var th = new Thread(() =>
            {
                try
                {
                    WebBrowser WB = new WebBrowser();
                    WB.ScriptErrorsSuppressed = true;
                    WB.Navigate("https://www.google.ru/");
 
                    Stopwatch Таймер = new Stopwatch();
                    Таймер.Start();
 
                    Console.WriteLine("Перед циклом, программа занимает " + (Process.GetCurrentProcess().WorkingSet64 / 1024).ToString() + " KB");
 
                    while (true)
                    {
                        if (Таймер.ElapsedMilliseconds > 15 * 1000)
                            break;
 
                        Application.DoEvents();
                        Thread.Sleep(50);
                    }
 
 
                    WB.Dispose();
                    Таймер = null;
 
                    Console.WriteLine("После цикла и высвобождение памяти браузера, программа занимает " + (Process.GetCurrentProcess().WorkingSet64 / 1024).ToString() + " KB");
 
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
 
                    Console.WriteLine("После коллектора, программа занимает " + (Process.GetCurrentProcess().WorkingSet64 / 1024).ToString() + " KB");
                    Thread.Sleep(-1);
                }
                catch { }
                Environment.Exit(0);
            });
            th.SetApartmentState(ApartmentState.STA);
            th.Start();
 
            Thread.Sleep(-1);
        }
После остановки цикла и высвобождения памяти, память все ровно остается занятой непонятно чем.
Опытным путем выяснил что во всем виноват Application.DoEvents();

Если из цикла не выходить, а бесконечно гонять метод, то приложение начинает бесконечно ждать память (по чуть-чуть)

Может я не правильно пользуюсь сборщиком мусора?
Загружать страницу другими методами - не вариант, мне нужна поддержка обработки JS, редиректы и прочее.
Использовать бибилотеки со сторонними браузера тоже не выход
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2016, 16:23
Ответы с готовыми решениями:

Чем заменить Application.DoEvents() для консольного периложения
Чем можно заменить Application.DoEvents() для консольного периложения?

Написать три алгоритма решения СЛАУ: Метод прогонки, метод квадратных корней, метод вращений
Начал писать курсовую. Нужно написать три алгоритма решения СЛАУ: прогонки, квадратных корней, вращений. С методом прогонки более менее...

Почему Application.DoEvents() иногда работает очень долго?
Добрый вечер. while (webBrowser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } Использую данную...

4
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
17.05.2016, 16:41
У вас жива ссылке на браузер, обнулите ее.
C#
1
WB = null;
А причем тут Application.DoEvents() вообще не понятно.
0
 Аватар для 0LyBmW2DEE
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 11
17.05.2016, 17:12  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
cation.DoEvents() вообще не понятно.
C#
1
WB.Dispose();
Делает абсолютно тоже самое.

Сделал вот так:
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
        static void Main(string[] args)
        {
            var th = new Thread(() =>
            {
                Stopwatch Таймер = new Stopwatch();
                Таймер.Start();
                {
                    WebBrowser WB = new WebBrowser();
                    WB.ScriptErrorsSuppressed = true;
                    WB.Navigate("https://www.google.ru/");
 
 
                    Console.WriteLine("Перед циклом, программа занимает " + (Process.GetCurrentProcess().WorkingSet64 / 1024).ToString() + " KB");
 
                    int i = 0;
 
                    while (i < 10)
                    {
                        i++;
                        Application.DoEvents();
 
                        Console.WriteLine(Таймер.Elapsed + " | 1 Программа занимает " + (Process.GetCurrentProcess().WorkingSet64 / 1024).ToString() + " KB");
                        GC.Collect(GC.MaxGeneration);
                        GC.WaitForPendingFinalizers();
 
                        Thread.Sleep(1000);
                    }
 
                    //MessageBox.Show(WB.DocumentText);
 
                    WB.Dispose();
                    WB = null;
 
                    while (true)
                    {
                        Console.WriteLine(Таймер.Elapsed + " | 2 Программа занимает " + (Process.GetCurrentProcess().WorkingSet64 / 1024).ToString() + " KB");
                        GC.Collect(GC.MaxGeneration);
                        GC.WaitForPendingFinalizers();
 
                        Thread.Sleep(1000);
                    }
                }
            });
            th.SetApartmentState(ApartmentState.STA);
            th.Start();
 
            Thread.Sleep(-1);
        }
Память все ровно не освобождается
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
17.05.2016, 17:46
https://msdn.microsoft.com/ru-... s.90).aspx
Пространство имен: System.Windows.Forms
При запуске Windows Form создается новая форма, которая затем будет ожидать события и обрабатывать их. Каждый раз при обработке события форма обрабатывает весь код, сопоставленный с этим событием. Все остальные события ожидают в очереди. Пока код обрабатывает событие, приложение не отвечает. Например, окно не будет обновляться, если поверх него перетаскивается другое окно.
Цитата Сообщение от 0LyBmW2DEE Посмотреть сообщение
Создаем консольное приложение
Цитата Сообщение от 0LyBmW2DEE Посмотреть сообщение
Опытным путем выяснил что во всем виноват Application.DoEvents();
Тебя ничего в этом всём не смущает?
0
 Аватар для 0LyBmW2DEE
0 / 0 / 0
Регистрация: 27.08.2015
Сообщений: 11
17.05.2016, 19:55  [ТС]
Ничего, консольное приложение я создал, что бы не было постороннего кода.
Вопросы у меня другие:
чем занята память и почему она не высвобождается полностью?

Даже спустя продолжительное время, выделенная память и используемая не освобождается.

В интернетах нагуглил:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void runBrowserThread(Uri url) {
    var th = new Thread(() => {
        var br = new WebBrowser();
        br.DocumentCompleted += browser_DocumentCompleted;
        br.Navigate(url);
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
}
 
void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
    var br = sender as WebBrowser;
    if (br.Url == e.Url) {
        Console.WriteLine("Natigated to {0}", e.Url);
        Application.ExitThread();   // Stops the thread
    }
}
Такой вод код, но проблема в том, что вызов события "browser_DocumentCompleted" может никогда не произойти, этот поток никак нельзя прервать
C#
1
th.Abort();
Не срабатывает, но если например в событии "browser_DocumentCompleted" вызвать Message.Box() то, "th.Abort()" вызовет желаемую реакцию, но это глупо.

Также, этот метод тоже занимает память, которую невозможно высвободить после окончания потока.
Что не так с Application?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2016, 19:55
Помогаю со студенческими работами здесь

метод Application.DoEvent()
Добрый день ) Такой трабл - есть главная форма Form1, и есть доп класc Class.cs. в Class.cs есть метод, который нужно прерывать по...

Application.DoEvents
Здравствуйте, возник такой вопрос. В программе используется команда Application.DoEvents. Как данная команда в соответствии с ГОСТом...

Работа с Application.DoEvents()
Есть приложение, работающее с WebBrowser. Есть кнопка автоматизации определенного действия. Есть булевая функция (вызывается в событии...

Замена Application.DoEvents()
Доброй ночи, форумчане!!! Сталкнулся с такой проблемой: в многопоточном приложении заявки приходят постоянно, и обрабатываются...

Как использовать Application.DoEvents() не в цикле
Добрый день, Товарищи! Не совсем могу разобраться как использовать Application.DoEvents(), не в цикле, а в коде. Допустим есть саб,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru