C# 在VB.NET/C上启动流程而不挂起我的工作流
我正在尝试构建一个loader-means,当我运行它时,它将启动一些预定义的程序。 问题是我不希望启动的程序中断我的工作流程,每个程序都有0-2秒的挂起时间 我想我可以在空闲或低于正常优先级的情况下启动进程。 但我只能在程序加载后设置优先级,这太晚了 有什么想法吗 请注意,一切正常,但问题是冻结持续时间很短——当加载的程序太少时,冻结持续时间会变得很长C# 在VB.NET/C上启动流程而不挂起我的工作流,c#,.net,vb.net,process,thread-priority,C#,.net,Vb.net,Process,Thread Priority,我正在尝试构建一个loader-means,当我运行它时,它将启动一些预定义的程序。 问题是我不希望启动的程序中断我的工作流程,每个程序都有0-2秒的挂起时间 我想我可以在空闲或低于正常优先级的情况下启动进程。 但我只能在程序加载后设置优先级,这太晚了 有什么想法吗 请注意,一切正常,但问题是冻结持续时间很短——当加载的程序太少时,冻结持续时间会变得很长 谢谢。一个选项是使用cmd/c start/low executable.exe参数启动Skype,这将在启动Skype.exe后完成,然后您
谢谢。一个选项是使用cmd/c start/low executable.exe参数启动Skype,这将在启动Skype.exe后完成,然后您可以按名称检索新的Skype.exe进程
proc.StartInfo.FileName = "cmd.exe"
proc.StartInfo.Arguments = "/c start /low ""C:\Program Files (x86)\Skype\Phone\Skype.exe"" /nosplash /minimized"
proc.Start()
proc.WaitForExit()
proc = (From p In System.Diagnostics.Process.GetProcessesByName("skype.exe") Order By p.StartTime Descending).FirstOrDefault()
`多亏了迈克·德鲁克,我做到了:
ProcessName=不带.exe的执行文件名-skype.exe===>skype
Private Sub StartProcessAndNormalize(Path As String, ProcessName As String, Optional Args As String = "", Optional PrintLog As Boolean = False)
If PrintLog = True Then Console.WriteLine("Starting --->" + ProcessName)
StartCmdProcess(Path, Args, ProcessName)
ProcessBackToNormal(ProcessName)
End Sub
Private Sub ProcessBackToNormal(ProcessName As String)
Dim proc As Process
Threading.Thread.Sleep(2000)
proc = (From p In System.Diagnostics.Process.GetProcessesByName(ProcessName) Order By p.StartTime Descending).FirstOrDefault()
Try
proc.PriorityClass = ProcessPriorityClass.Normal
Catch
Console.WriteLine("Can't find process " & ProcessName)
End Try
End Sub
Private Sub StartCmdProcess(Path As String, Args As String, Optional ProcessName As String = "")
Dim proc As Process = New Process
proc.StartInfo.FileName = "cmd.exe"
proc.StartInfo.Arguments = "/c start """ & ProcessName & """ /BelowNormal """ & Path & """ " & Args
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
proc.Start()
proc.WaitForExit()
End Sub
我们这样使用它:
StartProcessAndNormalize("C:\Program Files (x86)\Skype\Phone\Skype.exe", "Skype", "/nosplash /minimized", showLog)
我认为在.NET中出现API是不可能的。您需要在CreateProcess上P/Invoke并启动挂起的进程。然后在继续之前设置其优先级。当您逐步使用调试器时,它挂起哪一行?还有,为什么需要设置优先级?他们是;你是说你的GUI冻结了吗?你试过线程吗?创建一个任务并在其中启动进程怎么样?c示例:Task.Run=>{/*启动进程的代码*/};哈,总是知道不要相信优先级:是的,我的意思是GUI会在短时间内冻结。我对.net中的任务不太熟悉,但是为什么它要阻止GUI冻结呢?当程序结束时,它不会终止任务吗?我将尝试深入研究第一个关于启动暂停进程的建议。
StartProcessAndNormalize("C:\Program Files (x86)\Skype\Phone\Skype.exe", "Skype", "/nosplash /minimized", showLog)