【问题标题】:Threads in VB.NETVB.NET 中的线程
【发布时间】:2012-06-10 10:29:40
【问题描述】:

好吧,我想我不是第一个问这个问题的人,但是在 VB.NET 中使用线程的最简单方法是什么?我的意思是,我需要从远程服务器下载一些字符串,然后在 GUI 中显示该字符串,所以我必须使用一些回调函数在主线程中调用它。我为此找到了不同的方法,但与 Python 相比,所有方法似乎都非常困难,在 Python 中(使用 GTK)我使用了类似的东西:

gobject.idle_add(callback_function, parameters)

并且“callback_function”在主线程中执行。我如何在 VB.NET 中做到这一点?

【问题讨论】:

    标签: vb.net multithreading callback


    【解决方案1】:

    这是一个简单的例子。它可能比其他一些语言更难一些,但它仍然不是非常复杂。下面的代码假定它在一个表单类中(如果不是,你需要使用一些控件或表单引用来调用Invoke):

     Private Sub beginDoWork()
         Dim thread As New Thread(AddressOf DoWork)
         thread.Start()
     End Sub
    
     Public Sub DoWork()
         Dim result As String = getStringFromRemoteServer()
         workCompleted(result)
     End Sub
    
     Private Delegate Sub workCompletedDelegate(result As String)
     Private Sub workCompleted(result As String)
          If InvokeRequired Then
              Invoke(New workCompletedDelegate(AddressOf workCompleted(result)
              Exit Sub
          End If
          Label1.Text = result
     End Sub
    

    这可以通过让DoWork 总是调用Invoke 来调用workCompleted 而不是让workCompleted 检查是否需要调用来进一步简化,但是我编写它的方式更加封装和高效如果您打算在 UI 线程而不是工作线程上完成工作。

    【讨论】:

    • “如果不是,您需要使用一些控件或表单引用来调用 Invoke” - 请您解释一下吗?
    • Invoke 和 InvokeRequired 是 Control 类的成员。 Form 继承自 Control,所以它也有这些方法。您需要这些方法在 UI 线程上调用 workCompleted 方法。因此,如果您的代码在表单本身中,您可以简单地调用 Invoke(或 Me.Invoke),但如果代码位于不从控件继承的单独类中,您将需要对表单或控件的引用所以你可以用它来调用 Invoke(例如 formOnWhichToShowResults.Invoke)
    • 谢谢。我对这个 VB.Net 的东西真的很陌生,有些东西即使对我来说并不新鲜,也很难理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多