2012-06-10 53 views
0

嗯,我想我不是第一个问这个问题的人,但是在VB.NET中使用线程最简单的方法是什么?我的意思是,我需要从远程服务器下载一些字符串,然后在GUI中显示该字符串,所以我必须使用一些回调函数在主线程中调用它。我发现这个不同的方法,但比起Python的地方(用GTK)我用像一切似乎很困难:VB.NET中的线程

gobject.idle_add(callback_function, parameters) 

和“CALLBACK_FUNCTION”在主线程中被执行。我如何在VB.NET中做到这一点?

回答

3

下面是一个简单的例子。这可能比其他一些语言更难一些,但它仍然不是非常复杂。下面的代码假定它是一个表单类中(如果没有,你需要使用一些控制或窗体引用调用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线程而不是工作线程上完成这项工作,那么我写它的方式会更加封装和高效。

+0

“如果没有,你需要使用一些控件或表单引用来调用Invoke” - 你能解释一下吗? – ov1d1u

+0

Invoke和InvokeRequired是Control类的成员。 Form从Control继承,所以它也有这些方法。您需要这些方法来在UI线程上调用workCompleted方法。所以,如果你的代码是在表单本身中,你可以简单地调用Invoke(或Me.Invoke),但是如果代码是在一个单独的类中,并且不从控件继承,那么你需要一个对表单或控件的引用所以你可以用它来调用Invoke(例如formOnWhichToShowResults.Invoke) –

+0

Gracias。我在这个VB.Net中真的很新,有些东西很难理解,即使它们对我而言并不新鲜。 – ov1d1u