C# 在VB.NET/C上启动流程而不挂起我的工作流

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后完成,然后您

我正在尝试构建一个loader-means,当我运行它时,它将启动一些预定义的程序。 问题是我不希望启动的程序中断我的工作流程,每个程序都有0-2秒的挂起时间

我想我可以在空闲或低于正常优先级的情况下启动进程。 但我只能在程序加载后设置优先级,这太晚了

有什么想法吗

请注意,一切正常,但问题是冻结持续时间很短——当加载的程序太少时,冻结持续时间会变得很长


谢谢。

一个选项是使用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)