无法更新文本框 vb.net -crossthreading

法比奥·拉梅罗

我正在尝试使应用程序运行多个(特别是 adb)命令并获取输出并显示在标签中。

首先,我需要启动进程来执行命令。感谢 stackoverflow 和 @pasty 我发现了这个(第二个回复):如何在 Visual Basic 中逐行获取命令提示符窗口的输出?

好吧,我认为因为它输出到控制台,所以将它写入标签很简单。大错!它给了我一个交叉线程错误!一点点谷歌搜索和堆栈溢出我发现了这个:vb.net 从一个线程访问,而不是在它创建的线程上

好吧,我试图实现它,但程序只是崩溃冻结。

这是代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' store error output lines

    Dim executable As String() = {"adb", "adb"}
    Dim arguments As String() = {"help", "reboot"}
    For i As Integer = 0 To 0
        Dim process = New Process()
        process.StartInfo = createStartInfo(executable(i), arguments(i))
        process.EnableRaisingEvents = True
        AddHandler process.Exited, Sub(ByVal sendera As Object, ByVal ea As System.EventArgs)
                                       Console.WriteLine(process.ExitTime)
                                       Console.WriteLine(". Processing done.")
                                       'UpdateTextBox(ea)

                                   End Sub
        ' catch standard output
        AddHandler process.OutputDataReceived, Sub(ByVal senderb As Object, ByVal eb As DataReceivedEventArgs)
                                                   If (Not String.IsNullOrEmpty(eb.Data)) Then
                                                       Console.WriteLine(String.Format("{0}> {1}", DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"), eb.Data))
                                                       'UpdateTextBox(eb.Data)

                                                   End If
                                               End Sub
        ' catch errors
        AddHandler process.ErrorDataReceived, Sub(ByVal senderc As Object, ByVal ec As DataReceivedEventArgs)
                                                  Console.WriteLine(String.Format("! {0}", ec.Data))
                                                  Dim a As String = String.Format("! {0}", ec.Data)
                                                  'UpdateTextBox(a)
                                              End Sub
        ' start process
        Dim result = process.Start()
        ' and wait for output
        process.BeginOutputReadLine()
        ' and wait for errors :-)
        process.BeginErrorReadLine()
        process.WaitForExit()

    Next

End Sub

Private Sub UpdateTextBox(ByVal a As String)
    If Me.InvokeRequired Then
        Dim args() As String = {a}
        Me.Invoke(New Action(Of String)(AddressOf UpdateTextBox), args)
        Return
    End If
    Label1.Text += "a"
End Sub

Private Function createStartInfo(ByVal executable As String, ByVal arguments As String) As ProcessStartInfo
    Dim processStartInfo = New ProcessStartInfo(executable, arguments)
    processStartInfo.WorkingDirectory = Path.GetDirectoryName(executable)
    ' we want to read standard output
    processStartInfo.RedirectStandardOutput = True
    ' we want to read the standard error
    processStartInfo.RedirectStandardError = True
    processStartInfo.UseShellExecute = False
    processStartInfo.ErrorDialog = False
    processStartInfo.CreateNoWindow = True
    Return processStartInfo

End Function

和源代码:https : //github.com/iAmAOpenSource/SyncfusionWindowsFormsApplication3

标记

调用process.WaitForExit()将阻塞 UI 线程,直到产生的进程退出,但在处理输出时process.OutputDataReceived您正在调用事件Me.Invoke试图在 UI 线程上运行代码,该线程被阻塞,因此程序冻结。您可以将逻辑Button1_Click移到另一个线程上,例如

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Task.Run(
        Sub()
            ... current logic
        End Sub
    )
End Sub

这样 UI 线程就不会被阻塞,Me.Invoke调用也不会导致死锁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用多线程vb.net时更新文本框

来自分类Dev

ASP.Net(VB)文本框-设置默认文本

来自分类Dev

使用vb.net中的文本框更新sql 2005数据库

来自分类Dev

vb.net中的SelectAll之后无法编辑文本框

来自分类Dev

屏蔽的文本框导致VB.NET错误

来自分类Dev

在vb.net中循环浏览文本框

来自分类Dev

vb.net在表单之间传递文本框。

来自分类Dev

vb.net中的文本框光标

来自分类Dev

显示从SQL到vb.net文本框的数据

来自分类Dev

在VB.NET中动态添加文本框

来自分类Dev

在文本框VB.net中显示逗号

来自分类Dev

文本框行进入listview子项vb.net

来自分类Dev

Vb.net附加文本框的行

来自分类Dev

打开文件富文本框(VB.NET)

来自分类Dev

VB.Net 文本框公式阅读器

来自分类Dev

在asp.net mvc中更新文本框值的脚本不起作用

来自分类Dev

asp.net C#更新文本框值而无需刷新

来自分类Dev

从文本框中输入文本到组合框vb.net

来自分类Dev

Vb.net从在其他文本框中逐行插入的文本框中获取文本

来自分类Dev

在asp.net vb.net中为文本框保留事件

来自分类Dev

从下拉列表值填充文本框-使用vb.net的asp.net

来自分类Dev

Vb.net 将文本框与时间和组合框值相乘

来自分类Dev

VB.NET 多行数据网格值到文本框(在文本框中显示一行)

来自分类Dev

VB.net加载控件和内容从文本文件到文本框

来自分类Dev

使用vb.net收集带有checkboxlist项目的文本框文本

来自分类Dev

从vb.net中的文本框中保存多行文本

来自分类Dev

VB.NET从文本框中获取文本而无需特定的字符串

来自分类Dev

从 vb.net 中的文本框中选择特定文本

来自分类Dev

VB .net 在按钮单击时更改所选文本框的文本

Related 相关文章

热门标签

归档