VB.NET 根据要求创建新流程

VB.NET Create New Processes at request

我在使用函数创建未定义数量的进程时遇到问题..

Function CreateJobProcess(ByVal Name, ByVal ffmpegpath, ByVal params)
        Try
            Dim Job As New Process

            Job.StartInfo.UseShellExecute = False
            Job.StartInfo.CreateNoWindow = True
            Job.StartInfo.RedirectStandardError = True
            Job.StartInfo.FileName = ffmpegpath
            Job.StartInfo.Arguments = params
            Job.Start()

            Return Job.Handle

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Return Nothing

    End Function

根据所选的列表视图条目,该函数从 1 次调用到多次,因此我需要为每个进程使用不同的名称。

对于我需要的每个进程:

1.name 创建的新进程(我必须从进程中读取标准错误)。 2.handle 个已创建的新进程。

P.S.

是否可以从进程句柄中获取标准错误?

首先,您应该启用 Option Strict 以避免某些类型的错误。

你真的不需要一个名字,我认为它是指一个变量,但你确实想保留 Process 引用,这样你就可以在它完成后处理它并读取 StdErr 和 StdOut。

如果你打算处理StdOut,你需要添加一个处理程序,然后在事件中添加一些代码来处理它。使用 ErrorDataReceived

的处理程序对 StdErr 执行相同的操作
' a collection of the jobs
Private jobs As New List(Of Process)

然后您的 Job Creator 可以 return 新流程或将其存储在列表本身中。

Private Sub CreateNewJob(ffmpegpath As String, params As String)
    Dim P As New Process
    With P.StartInfo
        .UseShellExecute = False
        .CreateNoWindow = False
        .RedirectStandardOutput = True
        .FileName = ffmpegpath 
        .Arguments = params 
    End With

    AddHandler P.OutputDataReceived, AddressOf _OutputDataReceived
    jobs.Add(P)
    P.Start()

End Sub

我会在 creator 中添加一个 Try/Catch 并将其构建为 Function,其中 return 是 ProcessNothing 如果它失败了一个或另一个原因。作为函数:

Dim p As Process = CreateNewJob("file path", "job args")
If p IsNot Nothing Then
    jobs.Add(p)
End If

您没有名字,但 jobs(N) 提供了一个参考,因此您可以在完成后 Dispose (jobs(N).HasExited = True)。它还提供了一种简单的方法来了解您有多少 运行,这样您就不会一次启动太多。

处理输出的事件处理器:

Private Sub _OutputDataReceived(sender As Object, 
           e As DataReceivedEventArgs)
   ' e.Data will be the output from the child process
End Sub