1

Как правильно написать когда операция требует одновременно и то и другое?

try
{
 lock(locker)
 {
 ....
 }
}
catch(...)
{
 ...
}

или так

lock(locker)
{
 try
 {
 ...
 }
 catch(...)
 {
 ...
 }
 }

И как быть в случае возникновения исключения, если оно будет залочено?

задан 12 дек. 2016 в 16:16
6
  • и так, и так можно. "исключения ... будет залочено" - это как? Commented 12 дек. 2016 в 16:25
  • @Igor то есть если в операции возникла ошибка, то ведь как-то нужно будет снять лок, он же из-за ошибки останется активным, как я понимаю. Commented 12 дек. 2016 в 16:48
  • @Bulson с чего бы? Commented 12 дек. 2016 в 16:52
  • Почитайте в любом учебнике что конструкция lock делает... Commented 12 дек. 2016 в 16:52
  • 3
    Нет, не останется. lock - это сокращенная запись Monitor.Enter/Exit с try-finaly. msdn.microsoft.com/en-us/library/c5kehkcz.aspx Commented 12 дек. 2016 в 16:52

1 ответ 1

-1

На SO настоятельно не рекомендуют использовать вместе c lock конструкцию try-catch. А советуют поступать так:

lock(whatever)
{
 try
 {
 MakeAMess();
 }
 finally
 {
 CleanItUp();
 // Либо доводим операцию до конца, либо откатываем в прежнее состояние
 }
}

Там пишут, что выбрасывание исключения в lock нарушает саму суть ради чего существует этот самый lock. Поэтому если возникло исключение есть два варианта:

  1. Прибить процесс совсем с помощью Environment.FailFast()
  2. Либо, если это возможно, откатить в прежнее состояние, до lock.

В оригинале можно ознакомиться здесь.

ответ дан 12 дек. 2016 в 18:22

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.