【问题标题】:VB Console Application, no tasks auto-closeVB 控制台应用程序,没有任务自动关闭
【发布时间】:2016-07-26 20:24:55
【问题描述】:

我的社区成员! 我正在创建自己的命令提示符,我想知道一些关于它的信息。 当我的程序完成任务时,例如这段代码:

        ElseIf cmdStr = "version" Then
        Console.ForegroundColor = ConsoleColor.White
        Console.Write("Current version: ")
        Console.ForegroundColor = ConsoleColor.Yellow
        Console.Write(appVersion)
        Console.ForegroundColor = ConsoleColor.Black
        Console.ReadLine()

Console.Readline() 之后有空白空间。 控制台应用程序将关闭。 如果没有任务,有没有让它做任务? 我总是把它放在那些空的地方:

Console.Clear
Main()

但我已经厌倦了这样做,因为我几乎达到了 50 个命令。 有办法吗?感谢您的宝贵时间!

【问题讨论】:

  • 你可以把它指向另一个潜艇吗?
  • 把它全部放在一个无限的While-loop 中?当你想停止任务时,只需调用Exit While,它应该继续循环之后的行(如果有的话)。
  • 我认为这行不通,但您尝试过console.readkey 吗?
  • 如果你找到带有If....ElseIf....ElseIf....End If的命令试试这个:pastebin.com/raw/6sqJ7hfi。这将为您节省一些时间。
  • 呃,我觉得你们不明白我的意思。它不应该循环命令。如果命令或其他东西(如错误)结束并且它没有任务。应用程序关闭。我希望它只是转到 Main() 方法。这就是我所说的。 'Console.Clear' & 'Main()'。如果它没有任何任务,我想这样做。

标签: vb.net console task


【解决方案1】:

如果您发现要为命令重写大量代码,请查看重构它们。您提到您已经厌倦了调用 clear 并返回到主 sub,但如果这在您的所有命令之间都很常见,那么您可以执行以下操作:

Public MustInherit Class ConsoleCommand
    MustOverride Sub command
    Public sub run()
        command()
        Console.ReadLine()
        Main()
    End sub
End Class

Public Class VersionCommand
    Inherits ConsoleCommand
    Public Overrides Sub command()
        Console.ForegroundColor = ConsoleColor.White
        Console.Write("Current version: ")
        Console.ForegroundColor = ConsoleColor.Yellow
        Console.Write(appVersion)
        Console.ForegroundColor = ConsoleColor.Black
    End Sub
End Class


Public Class CommandFactory
    Public Function GetCommand(cmdStr As string) As ConsoleCommand
        Select Case cmdStr
            Case "version"
                Return New VersionCommand
            Case Else
                Return nothing
        End Select
    End Function
End Class

然后在你的主子中:

sub Main()

dim factory as new CommandFactory()
dim cmdText as string = Console.ReadLine()
dim command = factory.GetCommand(cmdText)
command.run()

end sub

或者删除

Console.ReadLine()
Console.Clear
Main()

从每个 if/else 分支并将其放在 End If 之后

//回应原发帖人关于想在“关闭”时退出的评论

Sub Main()

dim cmdStr as string = String.Empty
do until cmdStr = "Close"
cmdStr = Console.ReadLine()
'Your if block goes here, minus the call back into main - which is now looping
loop

End Sub

【讨论】:

  • 感谢您的时间和精力。但这并不能解决我的问题。我仍然需要在“案例”部分中输入所有内容。这有两个不好的方面。 1:我的代码变长了。 2:我可以像现在一样做'Main()'。
  • 如果您在每个 if/else 分支中调用 Console.ReadLine()、Console.Clear + Main(),那么以这种方式重构将为您节省大量代码,这意味着您遵守 DRY 原则,好处是你的 main sub 只包含几行代码
  • 是的,我明白了。但我不想这样做,因为(一个改装者)我遇到了很多错误。我想知道如何不让应用程序关闭,只能使用“关闭”命令和退出按钮。
  • 好的,剩下一个问题。我应该把Do Until cmdStr = "Close" 放在哪里?我有一个欢迎信息。我需要将欢迎信息放在Do Until 上方或下方吗?
  • 纯属个人喜好,如果您希望在每个命令完成后重复您的欢迎信息,请将其直接放在 do until 语句下方。如果您只想在程序首次启动时显示欢迎消息,请将其放在 do until 语句上方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多