2013-02-25 78 views
1

爲什麼下面的代碼始終在obj中返回False。我已確保SomeBoolReturningFunc正在返回True從ThreadPool返回值線程

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

'Keep waiting till queued thread completes 
Return obj 

回答

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.Value現在將改爲True

爲了解決您的問題,你可以使用一個可變的包裝類。

+0

謝謝你一堆。這正是我最終的結果。這也提出了另一個問題,我發佈在http://stackoverflow.com/questions/15064027/is-there-a-built-in-generic-class-for-this-in-net。請看一看。 – dotNET 2013-02-25 09:46:58