【问题标题】:Start a process without hanging my workflow on VB.NET / C#无需在 VB.NET / C# 上挂起我的工作流程即可启动进程
【发布时间】:2013-09-20 15:29:53
【问题描述】:

我正在尝试构建一个“加载器”- 意思是,当我运行它时会启动一些预定义程序的程序。 问题是我不希望启动的程序中断我的工作流程,并且每个程序都有 0-2 秒的“挂起”

            If showLog = True Then Console.WriteLine("Starting --->" + "Skype")
            proc.StartInfo.FileName = "C:\Program Files (x86)\Skype\Phone\Skype.exe"
            proc.StartInfo.Arguments = "/nosplash /minimized"
            proc.Start()
            proc.PriorityClass = ProcessPriorityClass.BelowNormal

我认为我可能能够以“空闲”或“BelowNormal”优先级启动该过程。 但我只能在程序加载之后设置该优先级 - 这为时已晚

有什么想法吗?

请注意,一切正常,但问题在于“冻结”持续时间太短 - 当加载的程序过多时,这会变得很重要。

谢谢。

【问题讨论】:

  • 我认为在 .NET 中使用浮出水面的 API 是不可能的。您需要在 CreateProcess 上 P/Invoke 并启动暂停的进程。然后在恢复之前设置其优先级。
  • 当您单步调试调试器时,它会挂在哪一行?另外,为什么需要设置优先级?他们是evil don't ya know? ;)
  • 您的意思是您的 GUI 冻结了吗?你试过线程吗?
  • 如何创建一个Task 并在其中启动您的流程? c#示例:Task.Run(() =>{ /*your code to start a process*/ });
  • 哈,一直都知道不要相信优先级 :) 是的,我的意思是 GUI 会在短时间内冻结。我对 .net 中的任务不太熟悉,但为什么要防止 GUI 冻结呢?当程序结束时它不会杀死任务吗?我将尝试深入研究关于启动进程暂停的第一个建议。

标签: c# .net vb.net process thread-priority


【解决方案1】:

一种选择是使用 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()

`

【讨论】:

    【解决方案2】:

    感谢迈克·德鲁克我做到了:

    (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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2014-05-21
      相关资源
      最近更新 更多