使用 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
,然后处理Process
的Exited
事件。在事件处理程序中,将下一个项目出列并再次执行相同操作。例如
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
事件。我已经调整了我的代码示例来解决这个问题。对于每个新的 Process
,EnableRaisingEvents
属性现在设置为 True
。您的其他问题超出了范围。
好的,它仍然只播放一首歌曲并停止。回到我原来的问题,我试图退出主程序,而 VLC 播放器正在运行第一个文件。我无法使用常规方式关闭它。
我怀疑你做错了什么,但没有看到你的代码就不可能说出来。您应该使用新代码和任何其他相关的新信息更新您的问题。以上是关于使用 process.start 后如何退出主程序?的主要内容,如果未能解决你的问题,请参考以下文章
Process.Start() 在 Windows 7 上立即退出
在wpf中使用Process.Start()启动了一个程序,要怎样才能等待这个程序执行完并输出结果后再执行后面的语句
如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?
从 Windows 服务调用时 Process.Start 不起作用