Vb.net 分配函数值而不是使用Return关键字,及其对同步代码执行的影响

Vb.net 分配函数值而不是使用Return关键字,及其对同步代码执行的影响,vb.net,synchronization,return,Vb.net,Synchronization,Return,我想知道使用 Public Function Foo() As Double Return 3.0 End Function 及 但特别是在代码执行方面 我正在尝试使用同步管理多线程应用程序,不确定是否正确捕获了每个锁和释放 我知道“Return”之后的代码行不会执行,因为函数失去了焦点,但是如果“Return”被包装在一个SyncLock块中呢 Public Function Foo() As Double SyncLock fooLock Return 3.0 End

我想知道使用

Public Function Foo() As Double
  Return 3.0
End Function

但特别是在代码执行方面

我正在尝试使用同步管理多线程应用程序,不确定是否正确捕获了每个锁和释放

我知道“Return”之后的代码行不会执行,因为函数失去了焦点,但是如果“Return”被包装在一个SyncLock块中呢

Public Function Foo() As Double
  SyncLock fooLock 
    Return 3.0
  End SyncLock
End Function
是否调用结束同步锁?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等待返回和后续代码,那么Finally可能需要一段时间才能获得机会,即

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
在这种情况下,我的锁可能锁得太久了。对于值类型,第一个代码是可接受的,但对于引用类型,第一个代码将释放锁,然后返回对对象的引用,使用者将具有对值的非同步访问,第二个代码可能工作,也可能不工作,这取决于函数中断期间执行的代码量


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

返回3和v=3之间肯定有区别

Return X在这里终止调用,但它肯定会通过您可能打开的任何try-catch-finally运行

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

我不能100%确定同步锁的问题,但我敢打赌退出会正确终止它。

请不要再使用“为函数名赋值并返回”模式。对我们中的一些人来说,这就是REM

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

关于你的另一个问题,根据:

SyncLock块保证释放锁,无论您如何退出块


我非常确信SyncLock块将正确返回并退出锁,但如果将SyncLock视为其等效的显式代码,那么问题仍然在于调用EffectLife“Finally”块的确切时间。在我的实际代码中,我使用的是ReaderWriterLock,因此需要关注如何构造代码的细节,SyncLock更多的是关于它实际在做什么的学术讨论。使用该模式的最初意图是由于一个相互竞争的事实,即没有任何东西,包括Threading.Monitor.Exit()将在Return语句之后执行,而我所追求的是一个属性,该属性的返回值在使用时被适当地锁定以便读取。
  Finally
    Threading.Monitor.Exit(fooLock)
  End Try
End Function