分配函数值而不是使用返回关键字及其对同步代码执行的影响

时间:2011-04-13 18:20:28

标签: vb.net synchronization return

我想知道使用

之间是否存在差异
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

在这种情况下,我的锁可能已经持有太长时间。对于值类型,第一个代码是可接受的,但对于引用类型,第一个代码将释放锁定然后返回对该对象的引用,并且消费者将具有对该值的非同步访问权限,第二个代码可能会或可能不会工作,具体取决于在函数中断之间执行多少代码。

有人能帮助我理顺这些概念吗?

2 个答案:

答案 0 :(得分:1)

RETURN 3与v = 3

之间肯定存在差异

返回X会在那里终止呼叫,但它肯定会通过任何尝试捕获,最后你可能已经打开了。

v = 3只是将返回值设置为3,但不返回。在函数中继续执行,直到函数结束或退出函数。

我对synclock问题并不是百分之百确定,但是我还是要退出,否则它会正确地终止它。

答案 1 :(得分:1)

请不要再使用“分配函数名称值并返回”模式。对于我们中的一些人而言REM

也就是说,如果你看一下使用return vs assign函数名的代码生成的IL,你会发现它是100%相同的。

至于你的另一个问题,根据MSDN

  

无论您如何退出块

,SyncLock块都可以保证释放锁定