使用 process.start 后如何退出主程序?

Posted

技术标签:

【中文标题】使用 process.start 后如何退出主程序?【英文标题】:how do I exit the main program after using process.start? 【发布时间】:2016-09-28 13:56:32 【问题描述】:

我有一个有效的 vb.net 程序,它简单地使用 process.start(MPC-HC.exe) 自动按顺序播放音乐文件的文本文件列表。一切都很好,除非用户希望在列表未完成时停止播放任何进一步的音乐。

按照建议更新代码后仍有 1 个问题: 因为我希望音乐在没有用户干预的情况下自动播放 - 我需要在每个选择自行完成播放后指定播放器关闭。这可以通过命令行开关“/play /close”来完成。

我该怎么做:

    指定要使用的播放器。 添加命令行开关

在我的原始代码中,我使用了 -

    Dim startInfo As New ProcessStartInfo
    startInfo.FileName = OpenWith
    startInfo.Arguments = f

在哪里

OpenWith = "C:\Program Files\mpc-hc\mpc-hc.exe"
f = vbDoubleQuote + TextLine + vbDoubleQuote + " /play /close"

我如何通过流程完成这些事情?

谢谢,

罗斯

这是更新后的 vb.net 代码以及建议的答案:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    OpenFileDialog1.Title = "Please Select a File"
    OpenFileDialog1.InitialDirectory = "C:\"
    OpenFileDialog1.Filter = "Text Files|*.txt"
    OpenFileDialog1.DefaultExt = "*.txt"
    OpenFileDialog1.FileName = "*.txt"
    OpenFileDialog1.ShowDialog()

    If OpenFileDialog1.CheckFileExists Then
        filePaths = New Queue(Of String)(File.ReadAllLines(OpenFileDialog1.FileName))

        'Execute the first file.
        process = Process.Start(filePaths.Dequeue())
        Process.EnableRaisingEvents = True
    End If

End Sub

Private Sub process_Exited(sender As Object, e As EventArgs) Handles process.Exited
    If filePaths.Count = 0 Then
        'No more files to execute.
        Application.Exit()
    Else
        'Execute the next file.
        Process = Process.Start(filePaths.Dequeue())
        Process.EnableRaisingEvents = True
    End If
End Sub

【问题讨论】:

这是因为您通过执行 .WaitForExit() 阻塞了 UI 线程。您需要响应Exited 事件才能知道何时移动到下一个文件。 我不完全理解 - 需要明确的是,我无法退出主应用程序,因为我正在使用 .WaitForExit()?正如所写,这对于不能一次播放所有音乐文件和打开太多文件是必要的。请进一步解释我如何“响应退出事件”。 jmcilhinney 的回答就是我的建议。 【参考方案1】:

不要使用循环并在其中调用WaitForExit。相反,将项目放在Queue 中,使下一个项目出列,调用Process.Start,然后处理ProcessExited 事件。在事件处理程序中,将下一个项目出列并再次执行相同操作。例如

Private WithEvents process As Process
Private filePaths As Queue(Of String)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    filePaths = New Queue(Of String)(File.ReadAllLines("source file path here"))

    'Execute the first file.
    process = Process.Start(filePaths.Dequeue())
    process.EnableRaisingEvents = True
End Sub

Private Sub process_Exited(sender As Object, e As EventArgs) Handles process.Exited
    If filePaths.Count = 0 Then
        'No more files to execute.
        Application.Exit()
    Else
        'Execute the next file.
        process = Process.Start(filePaths.Dequeue())
        process.EnableRaisingEvents = True
    End If
End Sub

【讨论】:

它只播放了第一个文件(带有关联的播放器“VLC.exe”)。我需要调用 process_Exited 来播放更多音乐吗? 它只播放了第一个文件(带有关联的播放器“VLC.exe”)。我需要调用 process_Exited 来播放更多音乐吗?它还给出了一个错误,说 VLC 要求在 1 标题后以不寻常的方式终止。它从未加载过第二个。我使用的是 MPC-HC,因为它允许我通过命令行参数启动/停止每个标题。我如何强制使用该播放器与默认播放器? 事实上,Process 对象实际上并没有引发Exited 事件。我已经调整了我的代码示例来解决这个问题。对于每个新的 ProcessEnableRaisingEvents 属性现在设置为 True。您的其他问题超出了范围。 好的,它仍然只播放一首歌曲并停止。回到我原来的问题,我试图退出主程序,而 VLC 播放器正在运行第一个文件。我无法使用常规方式关闭它。 我怀疑你做错了什么,但没有看到你的代码就不可能说出来。您应该使用新代码和任何其他相关的新信息更新您的问题。

以上是关于使用 process.start 后如何退出主程序?的主要内容,如果未能解决你的问题,请参考以下文章

Process.Start() 在 Windows 7 上立即退出

在wpf中使用Process.Start()启动了一个程序,要怎样才能等待这个程序执行完并输出结果后再执行后面的语句

如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?

从 Windows 服务调用时 Process.Start 不起作用

Process.CloseMainWindow等效于托盘中运行的程序?

C#调用Exe程序示例