2016-06-22 83 views
0

我有一個子方法與參數的方法創建一個任務:Visual Basic .NET中:如何從參數

Public Sub mysub(ByVal x As Object) 
    [...] 
End Sub 

要啓動它作爲一個線程,我做的只是:

Dim x1 as String = "hello" 
mythread = New Thread(AddressOf mysub) 
mythread.Start(x1) 

我會變換mysubasync函數。在線教程(例如,this one)僅適用於不帶參數的方法。

我試着用:

Dim mytask As Task 
Dim x1 as String = "hello" 
mytask = New Task(Me.mysub, x1) 
mytast.Start() 

,但我得到的錯誤:

Error BC30455 Argument not specified for parameter 'x' of 'Public Sub mysub(x As Object)'

+4

如果你使用.NET 4.0或更高版本,你可以使用lambdas:'New Task(Sub()Me.mysub(x1))' –

+0

就是這樣!萬分感謝。 –

回答

1

使用子method會導致代碼繼續使用並聯,主,子代碼運行。注意這可能會導致競爭條件(see here),並且您將無法「充分」利用異步/等待方便的編程。這與您在開始時建議的多線程應用程序完全相同。

在VB中,你需要做一個lambda定製子調用你的代碼,那麼你可以傳遞任何參數:

Dim t As Task 
    t = New Task(Sub() mysub(param)) 

    Public Sub mysub(ByVal param As ParamObject) 
     [...] 
    End Sub 

然而,對於答案的完整性,讓我們考慮另外使用function爲好。所有函數都會返回一些信息,並通過使用關鍵字await強制代碼執行暫停,直到結果準備就緒。

在VB中,您需要定義一個包含返回類型的lambda自定義函數。然後你可以調用你的函數,包括任何需要的參數。

Dim t As Task(Of RetObject) 
    t = Task.Run(Function() As RetObject 
        Return myfunction(param) 
       End Function) 
    Return Await t 

    Public Function myfunction(ByVal param As ParamObject) As RetObject 
     [...] 
    End Function 

你在這裏做的是async同步代碼的包裝函數。由於許多原因,這是不鼓勵的(see here)。總是建議從頭開始編寫代碼,這需要從地下室執行async-await行爲。