Luiey Ichigo Ответов: 2

Предотвратить завершение консоли с помощью ctrl-C или нескольких нажатий клавиши enter, когда консоль выполняет асинхронную задачу?


Привет ребята,

Как предотвратить выход консоли во время выполнения асинхронной задачи или в режиме ожидания.Задержка (миллисекунды)?

В настоящее время на моем основном:
Sub Main(ByVal args() As String)
    If args.Length <> 0 Then
        Dim i As Integer = 0
        While i < args.Length
            If (args(i)) = "config" Then
                HideConsole()
                System.Windows.Forms.Application.EnableVisualStyles()
                System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(False)
                System.Windows.Forms.Application.Run(New formsettings)
            End If
            i = i + 1
        End While
    Else
        ShowConsole()
        MaximizeConsole()
        Trace.Listeners.Clear()
        Dim twtl As New TextWriterTraceListener(AppDomain.CurrentDomain.BaseDirectory & "out.txt")
        twtl.Name = "TextLogger"
        twtl.TraceOutputOptions = TraceOptions.ThreadId Or TraceOptions.DateTime
        Dim ctl As New ConsoleTraceListener(False)
        ctl.TraceOutputOptions = TraceOptions.DateTime
        Trace.Listeners.Add(twtl)
        Trace.Listeners.Add(ctl)
        Trace.AutoFlush = True
        Trace.WriteLine("Program started at " & DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss:fff"))
        ConsoleStartup()
        Console.ReadKey()
    End If
End Sub

Где ConsoleStartup именно там задача будет выполняться по интервалу. Скажем, каждые один час:-
Private Sub ConsoleStartup()
	Try
		Do
			tmr_repeat = TimeSpan.Parse(My.MySettings.Default.Interval).TotalMilliseconds
			For i = 1 To 7
				Console.WriteLine(DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss:fff") & " > Checking for Line: {0}", i)
				dt_local = ShowTotalCount(objlocalconn, i)
				Await CompareValue(i)
			Next
			Dim date1 As Date = Date.Now
			Dim toadd As Integer = TimeSpan.Parse(My.MySettings.Default.Interval).TotalSeconds
			Dim date3 As Date = date1.AddSeconds(toadd)
			Console.WriteLine(DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss:fff") & " > Timer restarted. Next batch process {0}", date3.ToString(dateFormat))
			Await Task.Delay(tmr_repeat)
		Loop
	Catch ex As Exception

	End Try
End Sub


В настоящее время всякий раз, когда я нажимаю Ctrl-C или случайно нажимаю клавишу Enter 2 раза, она внезапно завершает работу консоли, даже если консоль выполняет какую-то задачу асинхронного цикла. Я попробовал какой-то код, но не работает, и даже я застрял на размещении кода и слиянии с моим ConsoleStartup Sub

Что я уже пробовал:

Sub Main(ByVal args() As String)
Dim t As Task = MainAsync(args)
Т.Ждать()
Конец Подводной Лодки
Частная функция MainAsync(ByVal args () As String) As Task
ShowConsole()
MaximizeConsole()
След.Слушатели.Четкий()
Dim twtl как новый TextWriterTraceListener(AppDomain.CurrentDomain. BaseDirectory & "out.txt")
твтл.Имя = " TextLogger"
твтл.TraceOutputOptions = TraceOptions.ThreadId Или TraceOptions.значение datetime
Dim ctl как новый ConsoleTraceListener (False)
ctl.TraceOutputOptions = TraceOptions.значение datetime
След.Слушатели.Добавить (twtl)
След.Слушателей.Добавить(ПНО)
След.Автосброс = Истина
След.Метода WriteLine("программа была начата на" &усилителя; дата и время.Сейчас.Метод toString("ДД-ММ-гггг чч:мм:СС:ФФФ"))
ConsoleStartup()
Приставка.ReadKey()
Конечная Функция

2 Ответов

Рейтинг:
1

Luiey Ichigo

Я использую этот код, и он не позволяет любой клавише выйти из консоли, даже клавиша Ctrl-C была нажата.

Private bExit As Boolean
Private input As String
Sub Main(ByVal args() As String)
	bExit = False
	Console.TreatControlCAsInput = True
	MainFunctionStartHere 'My main task function will be called here
	Do
		input = Console.ReadLine() 'While function is running, this will
                                   'start capturing key
		If input = "P" Then
			bExit = True
			Trace.WriteLine("Exiting!")
			Task.Delay(3000)
		End If
	Loop While (Not (bExit))
End Sub

Я не знаю, есть ли какой-то другой способ, который работает с моим кодом


Рейтинг:
0

Garth J Lancaster

Я не знаю, почему вы пометили свой вопрос C#, потому что ваш код явно не является таковым ... в любом случае

вы смотрели на Функция SetConsoleCtrlHandler (Windows)[^] ?

У меня есть консольный процесс в c#, который использует Control-C для "отключения" события и выполнения дополнительной работы или, в другом случае, для подачи сигнала фоновому работнику, чтобы он прекратил то, что делает .. в обоих случаях, и именно здесь он попадает в серую зону, я затем продолжаю работать, даже позволяя снова использовать Control-C (в отличие от комментария, который я видел, предполагая, что обработчик должен был сделать свою работу быстро, иначе программа станет нестабильной .. Я предполагаю, что обработчик действительно делает свою работу быстро-вызывает событие, но Control-C/Control-Break и т. д. находится в ловушке), и я могу делать все, что угодно после этого

Я почти уверен, что есть VB.Чистый код, показывающий, как использовать SetConsoleCtrlHandler - это может быть AddressOf.com : Обработка Консольных Событий[^]

извините, это только ответ на часть вашего вопроса, мне придется подумать о клавиатурной части... в крайнем случае я бы подумал о том, чтобы установить флаг, чтобы сказать "Я работаю", а затем, когда флаг "не установлен", то есть работа закончена, смыть буфер клавиатуры [/edit]


Luiey Ichigo

Привет Гарт,

Я открываюсь как для C#, так и для Visual Basic. Я пишу на Visual Basic, но могу перевести эти C# и применить на своем VB. Вот почему я отмечаю оба языка. В настоящее время я применяю один код. Которые на самом деле ловят любой символ и фильтруют его для целей выхода. И он также ловит комбинированный ключ.


Частная bExit как логическое
Частный ввод в виде строки
Sub Main(ByVal args() As String)
bExit = False
Приставка.TreatControlCAsInput = True
StartTaskHere ' моя основная функция задачи будет вызвана здесь
Делать
вход = консоль.С readline()
Если input = "P", то
bExit = True
Приставка.WriteLine ("Выход!")
Задача.Задержка (3000)
Конец, Если
Цикл While (Not (bExit))
Конец Подводной Лодки