powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
6 сообщений из 6, страница 1 из 1
Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
    #39821063
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е.
1) запустилась консоль/ запустилась main()
2) запустились дела
3) зарядились события
4) события ловятся и пишут в консоль
Console.WriteLine("Я тут. Дела идут.")

Как грамотно сделать в main():
1) чтоб консоль не закрылась пока "дела идут".
2) чтоб она закрылась, когда "дела сделаны". (сигнал приходит из заключительного события)
3) чтоб она закрылась нажатием "горячей клавиши", когда надоело "смотреть за делами" (сигнал приходит от юзера)

Примитивно
Код: vbnet
1.
2.
3.
            While (bДелаИдут = True)
               Application.DoEvents() 'опционально
            End While


Чревато "загрузкой процессора"
Можно еще засунуть
Код: vbnet
1.
           Console.ReadLine()


(типа нажал Enter - вышел)

Конкретно: создаем задание факса для Windows Fax Server и его тут же и отслеживаем через события objFaxServer,
надоело отслеживать, "стукнули" по консоли и вышли (оно от этого выполняться не перестанет).
(Через GUI отслеживается пока открыта форма, теперь надо сделать скупо через консоль, цикл или таймер как таковой не нужен, все через события в модуле, но надо чтоб main не завершалась)

По хорошему еще б обратное управление процессом через консоль
Команды Cancel/Delete, Pause, Resume (в любой момент).
...
Рейтинг: 0 / 0
Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
    #39821073
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Запускаешь задачу в потоке, добавляешь в Continuation принудительный выход из программы. Пока задача выполняется работаешь с консолью стандартным образом, прокидываешь внутрь задачи команды через события. Вроде всё очевидно.
...
Рейтинг: 0 / 0
Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
    #39821074
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

вот простейший пример:

Код: 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.
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // для принудительной отмены работы
                var cts = new CancellationTokenSource();
                // запускаем задачу в фоне
                var task = Task
                    // передаём токен для отмены работы
                    .Run(() => DoWorkAsync(cts.Token))
                    // по окончанию работы нужно принудительно выйти из приложения
                    .ContinueWith(t => Environment.Exit(0));

                var input = string.Empty;
                // работаем  с вводом от пользователя
                while (true)
                {
                    switch (input?.ToLower())
                    {
                        // если ввести "c", то выйти
                        case "c":
                            Console.WriteLine("Canceled");
                            cts.Cancel();
                            break;
                        // если ввести "p", поставить на паузу
                        case "p":
                            Console.WriteLine("Paused");
                            mrw.Reset();
                            break;
                        // если ввести "r", продолжить работу
                        case "r":
                            Console.WriteLine("Resets");
                            mrw.Set();
                            break;
                        // вывести справку
                        default:
                            Console.WriteLine("type [c]ancel, [p]ause, [r]eset: ");
                            break;
                    }
                    input = Console.ReadLine();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }

        // событие для ручного управления работой
        private static ManualResetEvent mrw = new ManualResetEvent(true);

        // метод, выполняющий работу
        static async Task DoWorkAsync(CancellationToken ct)
        {
            // конечное кол-во итераций для проверки выхода по окончанию работы
            var counter = 10;
            // всегда проверяем, не поступила ли команда завершить работу
            while (!ct.IsCancellationRequested && --counter > 0)
            {
                mrw.WaitOne();
                // делаем какую-то работу
                Console.WriteLine("im working");
                await Task.Delay(1000, ct);
            }
        }
    }
...
Рейтинг: 0 / 0
Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
    #39821075
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
сложно что-то. И Task-и кажется отсутствуют в .Net 2.0 (у меня дублированные exe Net 4.5/2.0)

У меня "постановка/запуск задачи" и инициализация COM-событий делается в потоке Main()

Решение нарыл.
Код: vbnet
1.
Application.Run()


(ну я так понял это эквивалент стандартной петли обработки сообщений, которая делается в C++, процессор не "грузится")

События сыплются, c Console.WriteLine("Я тут. Дела идут.") проблем нет.
Консоль не закрывается.

Для автозавершения и корректного продвижения в конец Main() из соответствующих событий достаточно сделать
Код: vbnet
1.
2.
3.
Application.Exit()
либо
Application.ExitThread()


Уж не знаю чего правильнее, но подозреваю для моего случая правилен любой вариант.
Типа так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Private Sub g_objFaxServer_OnOutgoingJobRemoved(pFaxServer As FAXCOMEXLib.FaxServer, bstrJobId As String) Handles g_objFaxServer.OnOutgoingJobRemoved
    If (fJob.Id <> "") AndAlso (bstrJobId = fJob.Id) Then
      AddSendFaxDebugLog("EVENT: OnOutgoingJobRemoved (JobId=" & bstrJobId & ")...")

      If bConsole Then Application.Exit()

      If fJob.bUseFaxOutgoingMessage = False Then
        If bConsole = False Then FormTrack.ProcessOnOutgoingMessageRemoved()
      End If
    End If
  End Sub



Остается вопрос с "управлением", уж не знаю можно ли при такой примитивной "конструкции",
но он изначально в моем "техзадании" не стоял (подумалось а че бы нет).
Основная задача "консоли", именно удержать процесс в напр. автоматическом последовательном режиме бат-файла.
А для управления уже сделан GUI-режим с кнопочками и свистелками (аж с найтивным Ribbon UI, рука набита).
...
Рейтинг: 0 / 0
Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
    #39821234
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77сложно что-то. И Task-и кажется отсутствуют в .Net 2.0 (у меня дублированные exe Net 4.5/2.0)

.NET 4.0 поддерживается даже на XP

https://docs.microsoft.com/ru-ru/dotnet/framework/get-started/system-requirements

версии 2.0 уже 15 лет почти стукнуло. зачем страдать? )


Дмитрий77Остается вопрос с "управлением", уж не знаю можно ли при такой примитивной "конструкции",

Чёт всё как обычно, нормальные адекватные решения тебе не подходят... Как прооперировать пациента молотком из зубилом левой ногой, удерживая протекающую крышу. Видимо на любителя.

Для управления я уже привёл код, даже если без тасков и в 2.0 есть BackgorundWorker и ThreadPool, https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.manualresetevent?view=netframework-2.0сигнальное событие, которое в моём примере всё также актуально и для старого фреймворка.
...
Рейтинг: 0 / 0
Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
    #39821235
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как организовать незакрытие "Консольного приложения", чтоб main() не выходила
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]