1

次のコードが常にで返されるのはなぜFalseですかobj。私はそれSomeBoolReturningFuncが戻ってくることを確認しましたTrue

Dim obj As Object = False
ThreadPool.QueueUserWorkItem(Sub(state)
                                  state = SomeBoolReturningFunc()
                             End Sub,
                             obj)

'Keep waiting till queued thread completes
Return obj
4

1 に答える 1

0

ここで何が起こるかを要約しましょう。

  1. 無名関数は、格納したオブジェクトをobj引数として受け取りますstate

  2. stateの戻り値でローカル変数を上書きしますSomeBoolReturningFunc

  3. 元のオブジェクトは変更されません。

期待どおりに動作させるには、匿名メソッドでByRefパラメーターを使用し、QueueUserWorkItemそれをサポートする必要があります。

問題を解決するには、変更可能なラッパー クラスを使用できます。

Class Wrapper
    Public Value as Boolean
End Class

Dim obj = new Wrapper()
obj.Value = False
ThreadPool.QueueUserWorkItem(Sub(state)
                                  obj.Value=SomeBoolReturningFunc()
                             End Sub, obj)

obj.ValueTrue無名関数が実行されるときに変更されます。

于 2013-02-25T09:38:24.120 に答える