2016-06-22 14 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) 

async関数に変換します。オンラインチュートリアル(例:this one)は、パラメータのないメソッドのみに使用されます。

私が試した:

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

が、私はエラーを取得:サブmethodを使用して

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

+4

.NET 4.0以上を使用している場合は、lambdasを使用できます。 '新しいタスク(Sub()Me.mysub(x1)) ' –

+0

それだけです!大いに感謝する。 –

答えて

1

はメインとサブコードの両方、コードがparalellに実行を継続します。これは競争条件(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では、戻り値の型を含むラムダカスタム関数を定義する必要があります。次に、必要なパラメータを含めて関数を呼び出すことができます。

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の行動をとるコードを最初から書くことを常に推奨します。

関連する問題