【问题标题】:update textbox when using multi thread vb.net使用多线程 vb.net 时更新文本框
【发布时间】:2015-06-27 03:12:14
【问题描述】:

我的代码

Imports System.IO
Public Class Form1
Dim thread As System.Threading.Thread
Dim thread2 As System.Threading.Thread
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    thread = New System.Threading.Thread(AddressOf getproxy)
    thread.Start()
End Sub
Private Sub getproxy()
    Try
        Dim ip As String = "76.125.85.66:16805 | 0.238 | Little Rock | AR | Unknown | United States69.207.212.76:49233 | 0.274 | Sayre | PA | 18840 | United States96.42.127.190:25480 | 0.292 | Sartell | MN | 56377 | United States"
        For Each m As Match In Regex.Matches(ip, "(?:\d{1,3}\.){3}\d{1,3}:\d+")
            TextBox1.Text += (m.Value) & vbNewLine
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

我希望它显示文本框所有代理格式

76.125.85.66:16805
69.207.212.76:49233
96.42.127.190:25480

但是出错了

{"跨线程操作无效:控件'TextBox1'从创建它的线程以外的线程访问。"}

【问题讨论】:

    标签: vb.net multithreading


    【解决方案1】:

    一旦启动线程,您将无法从 UI 线程访问控制。您可以Invoke UI 线程并更新文本框。

    Private Sub getproxy()
        Dim ip As String = "76.125.85.66:16805 | 0.238 | Little Rock | AR | Unknown | United States69.207.212.76:49233 | 0.274 | Sayre | PA | 18840 | United States96.42.127.190:25480 | 0.292 | Sartell | MN | 56377 | United States"
        Me.Invoke(Sub() 
         For Each m As Match In Regex.Matches(ip, "(?:\d{1,3}\.){3}\d{1,3}:\d+")         
          TextBox1.Text += (m.Value) & Enviroment.NewLine
         Next
                   End Sub)
    End Sub 
    

    PS 为什么你需要一个线程来完成这项工作?似乎这需要很少的时间来执行。线程用于长时间的工作。

    【讨论】:

      【解决方案2】:

      getproxy() 内部实际上还有更多工作要做吗?

      无论如何,您应该只 Invoke() 实际更新 UI 的代码。其余代码应该在另一个线程中运行:

      Private Sub getproxy()
          Try
              Dim ip As String = "76.125.85.66:16805 | 0.238 | Little Rock | AR | Unknown | United States69.207.212.76:49233 | 0.274 | Sayre | PA | 18840 | United States96.42.127.190:25480 | 0.292 | Sartell | MN | 56377 | United States"
              For Each m As Match In Regex.Matches(ip, "(?:\d{1,3}\.){3}\d{1,3}:\d+")
      
                  ' ... possibly some other work done with "m.Value" ...
      
                  ' Invoke just the updating of the UI itself:
                  TextBox1.Invoke(Sub()
                                      TextBox1.AppendText(m.Value & vbNewLine)
                                  End Sub)
              Next
          Catch ex As Exception
              MsgBox(ex.Message)
          End Try
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多