我想知道使用
之间是否存在差异Public Function Foo() As Double
Return 3.0
End Function
和
Public Function Foo() As Double
Foo = 3.0
End Function
但特别是关于代码执行。
我正在尝试使用同步管理多线程应用程序,并且不确定我是否正在捕获每个锁并正确释放。
我理解'Return'之后的代码行没有被执行,因为函数失去焦点,但是如果'Return'被包装在SyncLock块中会怎样?
Public Function Foo() As Double
SyncLock fooLock
Return 3.0
End SyncLock
End Function
是否会调用End SyncLock?是SyncLock块的缩写:
Public Function Foo() As Double
Dim result as Double
Try
Threading.Monitor.Enter(fooLock)
result = 3.0
Finally
Threading.Monitor.Exit(fooLock)
End Try
Return result
End Function
如果我的理解是正确的,那么Finally块在函数释放焦点之前出现,但是如果Finally等待Return和后续代码,那么它可能需要一段时间才能获得机会,即
Public Sub DoSomething()
Dim a As Double = Foo
...Do other things
End Sub
Public Function Foo() As Double
Try
Threading.Monitor.Enter(fooLock)
Return 3.0
...代码返回执行,'a'被赋值给Foo的返回值,那么也许线程上的所有其他任务都完成了,然后
Finally
Threading.Monitor.Exit(fooLock)
End Try
End Function
在这种情况下,我的锁可能已经持有太长时间。对于值类型,第一个代码是可接受的,但对于引用类型,第一个代码将释放锁定然后返回对该对象的引用,并且消费者将具有对该值的非同步访问权限,第二个代码可能会或可能不会工作,具体取决于在函数中断之间执行多少代码。
有人能帮助我理顺这些概念吗?
答案 0 :(得分:1)
RETURN 3与v = 3
之间肯定存在差异返回X会在那里终止呼叫,但它肯定会通过任何尝试捕获,最后你可能已经打开了。
v = 3只是将返回值设置为3,但不返回。在函数中继续执行,直到函数结束或退出函数。
我对synclock问题并不是百分之百确定,但是我还是要退出,否则它会正确地终止它。
答案 1 :(得分:1)
请不要再使用“分配函数名称值并返回”模式。对于我们中的一些人而言REM
。
也就是说,如果你看一下使用return vs assign函数名的代码生成的IL,你会发现它是100%相同的。
至于你的另一个问题,根据MSDN:
无论您如何退出块
,SyncLock块都可以保证释放锁定