Назначение значения функции вместо использования ключевого слова возврата и его влияние на синхронизированное выполнение кода - PullRequest
1 голос
/ 13 апреля 2011

Мне интересно, есть ли разница между использованием

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

В этом случае мой замок мог держаться слишком долго. Для типов значений первый код будет приемлемым, но для ссылочных типов первый снимет блокировку, а затем вернет ссылку на объект, и потребитель получит несинхронизированный доступ к значению, второй может или не может работать, в зависимости о том, сколько кода выполняется между перерывами в функции.

Может ли кто-нибудь помочь мне разобраться в этих понятиях?

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Пожалуйста, больше не используйте шаблон «присвоить имя функции значение и возврат». Это там с REM для некоторых из нас.

Тем не менее, если вы посмотрите на IL, сгенерированный из кода, который использует имя функции return vs assign, вы увидите, что оно на 100% одинаково.

Что касается вашего другого вопроса, то согласно MSDN :

Блок SyncLock гарантирует снятие блокировки, независимо от того, как вы выходите из блока

1 голос
/ 13 апреля 2011

Определенно есть разница между RETURN 3 и v = 3

Return X завершает вызов прямо там, но он определенно проходит через любой перехват попытки, наконец, у вас может быть открытие.

v= 3 просто устанавливает возвращаемое значение как 3 , но не возвращает .Выполнение в функции продолжается до конца функции или функции выхода.

Я не уверен на 100% в вопросе о синхронизации, но я бы поспорил, что возврат из него завершит его должным образом.

...