Мне интересно, есть ли разница между использованием
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
Если мое понимание правильное, то блок «Наконец» находится перед тем, как функция освобождает фокус, но в качестве альтернативы, если «Окончание» ожидает возврата и последующего кода, тогда может пройти некоторое время, прежде чем «Наконец» получит шанс, т.е.
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
В этом случае мой замок мог держаться слишком долго. Для типов значений первый код будет приемлемым, но для ссылочных типов первый снимет блокировку, а затем вернет ссылку на объект, и потребитель получит несинхронизированный доступ к значению, второй может или не может работать, в зависимости о том, сколько кода выполняется между перерывами в функции.
Может ли кто-нибудь помочь мне разобраться в этих понятиях?