Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net-将输出重定向到表单文本框_Vb.net_Process - Fatal编程技术网

vb.net-将输出重定向到表单文本框

vb.net-将输出重定向到表单文本框,vb.net,process,Vb.net,Process,我正在尝试在vb.net项目中读取/使用python程序的输出,到目前为止,我没有得到任何结果。我想看到的是python程序运行(首先只运行它自己),所有的输出被重定向到一个文本框中 我看过其他一些关于这方面的帖子,但我要么遗漏了什么,要么不理解什么,因为我得到的只是空白输出。 公开课表格1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

我正在尝试在vb.net项目中读取/使用python程序的输出,到目前为止,我没有得到任何结果。我想看到的是python程序运行(首先只运行它自己),所有的输出被重定向到一个文本框中

我看过其他一些关于这方面的帖子,但我要么遗漏了什么,要么不理解什么,因为我得到的只是空白输出。 公开课表格1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim PythonPath = "C:\Python27\"
    Dim strPath As String = Application.StartupPath
    MessageBox.Show(PythonPath & "python.exe  """ & strPath & "\Resources\import_logs.py"" ")

    Dim start_info As New ProcessStartInfo(TextBox1.Text)

    ' Make the process and set its start information.
    Dim process As New Process()
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    process.StartInfo.FileName = PythonPath & "\python.exe"
    process.StartInfo.Arguments = """" & strPath & "\resources\import_logs.py"""""
    process.StartInfo.UseShellExecute = False
    process.StartInfo.CreateNoWindow = True
    process.StartInfo.RedirectStandardOutput = True
    'process.StartInfo.RedirectStandardError = True

    AddHandler process.OutputDataReceived, AddressOf proccess_OutputDataReceived

    process.Start()
    process.BeginOutputReadLine()
End Sub

Public Sub proccess_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
    On Error Resume Next
    ' output will be in string e.Data
    ' modify TextBox.Text here
    'Server_Logs.Text = e.Data  ` Does not display anything in textbox
    MsgBox(e.Data) 'It works but I want output in text box field
End Sub
End Class
最后,我将把参数传递给python脚本,我希望得到可以使用的反馈(将错误插入数据库、完成时发送电子邮件等),因此我希望它在运行时捕获流程,而不仅仅是在最后进行数据转储


任何帮助都将不胜感激。

首先,难怪您不确定代码出了什么问题,您正在消除所有可能有助于诊断的错误。这是VB.NET中“错误恢复下一步”的唯一目的。非结构化错误处理只是为了向后兼容VB的.NET之前版本,现在是时候忘记它曾经存在过了。您当然不想在代码中使用它。(我会说“在您正在调试的代码中”,但所有代码都是调试的潜在候选代码,忽略错误是愚蠢的。)

不管怎么说,我们来谈谈具体的问题。我们知道对
MsgBox
的调用是有效的,但是当您开始与表单上的控件交互时,它就不能正常工作。所以那里有些东西正在崩溃

事实证明,
OutputDataReceived
事件是在一个完全不同的线程上引发的,该线程与用于创建进程的线程不同,与运行应用程序UI的线程不同。它实际上只是从系统线程池中检索一个线程

这就是问题所在:除了创建这些对象的线程之外,您不能在其他线程上操作UI对象(至少不能不跳过一些环),这正是您的代码在这里试图做的。事实上,您可能正在接受一个异常,该异常相当迟钝地通知您这种情况

简单的解决方法是将
进程
类的属性设置为一个UI组件(如表单或要输出到的特定控件)。这将强制所有事件处理程序在创建该组件的同一线程上执行。在这一点上,您的代码应该可以正常工作,因为您没有尝试进行任何跨线程UI访问。(消息框不易受此攻击,因为任何线程都可以显示消息框。您没有尝试访问绑定到其他线程的现有UI对象。)

或者,您可以通过使用委托和
BeginInvoke
方法在事件处理程序方法中自己处理编组,但这对我来说似乎是不必要的工作