2013-02-25 81 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