Потоковый вывод из консоли CMD в VB ListBox

#vb.net #visual-studio-2010 #visual-studio

#vb.net #visual-studio-2010 #visual-studio

Вопрос:

Я пытаюсь передать текст из консоли в Listbox1 строку за строкой, чтобы скрытая консоль передавала его вывод в мой список. Но я получаю Cross-thread operation not valid

 Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim start_info As New ProcessStartInfo()

    start_info.FileName = ("cmd.exe")
    start_info.UseShellExecute = False
    start_info.CreateNoWindow = False
    start_info.RedirectStandardOutput = True
    start_info.WindowStyle = ProcessWindowStyle.Hidden
    start_info.Arguments = ("ipconfig")

    Dim proc As New Process
    proc.StartInfo = start_info
    proc.Start()

    Dim std_out As System.IO.StreamReader
    std_out = proc.StandardOutput

    Do
        ListBox1.Items.Add(std_out.ReadLine)
    Loop While proc.HasExited = False

End Sub
  

Ответ №1:

DoWork Событие BackgroundWorker выполняется в потоке, отличном от пользовательского интерфейса. Вам нужно будет убедиться, что элементы добавляются в поток пользовательского интерфейса. Invoke Для этого используйте, например.

Измените свой Do ... Loop While на следующий:

 Do
    Dim line As String = std_out.ReadLine()
    ListBox1.Invoke(Sub() ListBox1.Items.Add(line))
Loop While proc.HasExited = False
  

Дополнительная информация также о MSDN: