Can';t通过ProcessStartInfo获取python文件到vb.net的实时输出

Can';t通过ProcessStartInfo获取python文件到vb.net的实时输出,python,vb.net,thread-safety,output,Python,Vb.net,Thread Safety,Output,嗨,我知道这里已经有很多相同的问题了,但我尝试了其中的每一个,似乎无法理解为什么它不起作用 这是我的密码 Private Sub CallbackProcessAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs) Console.WriteLine(args.Data) Me.Invoke(Sub() statusRichText.AppendText(arg

嗨,我知道这里已经有很多相同的问题了,但我尝试了其中的每一个,似乎无法理解为什么它不起作用

这是我的密码

    Private Sub CallbackProcessAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs)


        Console.WriteLine(args.Data)
        Me.Invoke(Sub() statusRichText.AppendText(args.Data & Environment.NewLine))

    End Sub




Sub SuperUpload()

    Dim oProcess As New Process()

    AddHandler oProcess.ErrorDataReceived, AddressOf CallbackProcessAsync
    AddHandler oProcess.OutputDataReceived, AddressOf CallbackProcessAsync

    Dim oStartInfo As New ProcessStartInfo("C:\Users\RKjetski\AppData\Local\Programs\Python\Python37\python.exe", "test.py " + vInfoIframe.Text + " " + vInfoID.Text)
    oStartInfo.UseShellExecute = False
    oStartInfo.CreateNoWindow = True
    oStartInfo.RedirectStandardError = True
    oStartInfo.RedirectStandardOutput = True


    oProcess.EnableRaisingEvents = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()

    oProcess.BeginErrorReadLine()
    oProcess.BeginOutputReadLine()

End Sub


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnSuperUpload.Click


    Dim thread = New System.Threading.Thread(AddressOf SuperUpload)
    thread.Start()
End Sub
python文件

    import time
x = 0
while x < 5:
    print(x)
    time.sleep(2)
    x = x +1
导入时间
x=0
当x<5时:
打印(x)
时间。睡眠(2)
x=x+1
我得到以下输出,但它不是实时的,富文本框是空的,直到它读取程序,然后立即打印所有内容。 0 1. 2. 3.
4

拆下螺纹。您的流程此时已经是事件驱动的(已经是异步的)。对
OutputDataReceived
ErrorDataReceived
使用两个不同的处理程序(更容易确定发生了什么)。将BeginInvoke()与委托一起使用(例如,
BeginInvoke(新方法调用程序(Sub()statusRichText.AppendText(…)End Sub))
)。仅用于引发已退出的
事件(…)。(…)的异步版本。向退出的
事件添加一个处理程序(您也可以在其中处置
进程
对象)或使用
WaitForExit
(此处使用前者)。你可以遵循这种模式:(C#代码,但要遵循那里的注释。尽管代码很简单)仍然没有让它工作,似乎是一样的。如果我在OutputDataReceive上添加1秒的暂停,那么它会一行一行地打印出来,所以我不明白为什么它还要等待加载整个脚本?在这里发布了更新的代码,刚刚注意到当ffmpeg运行它的脚本时,它似乎在我的错误处理程序上工作?不确定是否假定输出为错误tho?