Проверка, владеет ли текущий поток блокировкой

Спасибо, я сделал некоторые изменения и теперь работаю лучше, добавив вручную ошибку ModelState в контроллер, не уверенный, что есть лучший способ, но работает.

Итак, добавив эту строку в код

 _controller.ModelState.AddModelError("Title", "Required");

И это снова полный код:

[Fact]
    public void Search_EmptyParametersPassed_ReturnsError400()
    {
        // Act
        _controller.ModelState.AddModelError("Title", "Required");
        var result = _controller.Search(new MovieFilters());

        // Assert
        Assert.IsType<BadRequestObjectResult>(result);
    }
17
задан Hubert Kario 4 February 2012 в 21:15
поделиться

6 ответов

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

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

5
ответ дан 30 November 2019 в 13:34
поделиться

Существует фундаментальная проблема с Вашим запросом. Предположим, что был IsLockHeld () метод, и Вы будете использовать его как это:

if (not IsLockHeld(someLockObj)) then DoSomething()

Это не может работать дизайном. Ваш поток мог быть предвосхищен между если () оператор и вызов метода. Разрешение другого потока работать и заблокировать объект. Теперь DoSomething () будет работать, даже при том, что блокировка сохранена.

единственный способ избежать это должно попытаться взять блокировку и видеть, работало ли это. Монитор. TryEnter ().

Вы видите тот же самый шаблон на работе в Windows. Нет никакого способа проверить, заблокирован ли файл другим процессом кроме попытки открыть файл. По той же самой причине.

3
ответ дан 30 November 2019 в 13:34
поделиться

Хорошо, я теперь понимаю Вашу проблему. Концептуально я теперь думаю о Семафорном объекте. Можно легко проверить семафорное значение (значение, больше, или равное, чем 0 означает, что ресурс доступен). Кроме того, это на самом деле не блокирует ресурс что, будучи сделанным путем постепенного увеличения или постепенного уменьшения семафорного значения. Семафор объект присутствует в платформе.NET, но я не использовал его так, я не могу обеспечить надлежащий пример. При необходимости я могу создать простой пример и отправить его здесь. Сообщить мне.

Alex.

L.E. Я не уверен теперь, если Вы на самом деле имеете контроль к механизмам синхронизации в приложении. Если у Вас только есть доступ к объекту, который мог бы быть заблокирован или нет, мое решение могло оказаться (еще раз) бесполезным.

1
ответ дан 30 November 2019 в 13:34
поделиться

Мне жаль, что это не было возможно, который сделает мой код очень, намного более чистым.

0
ответ дан 30 November 2019 в 13:34
поделиться

У меня нет никакого опыта в программировании на .NET, но в своем собственном коде (Delphi) я однажды реализовал такие утверждения, имея собственные методы Acquire () и Release () в классе критической секции, с закрытой переменной-членом для идентификатор потока, получившего CS. После EnterCriticalSection () было записано возвращаемое значение GetCurrentThreadID, а до LeaveCriticalSection () значение поля было сброшено.

Но я не знаю, допускает ли .NET подобное, или вы могли бы реализовать это в своей программе ...

0
ответ дан 30 November 2019 в 13:34
поделиться

Не лучшая вещь сделать, но...

bool OwnsLock(object someLockObj)
{
  if (Monitor.TryEnter(someLockObj))
  {
    Monitor.Exit();
    return false;
  }
  return true;
}

Debug.Assert(OwnsLock(_someLockObject), "_someLockObject should be locked when this method is called")
-1
ответ дан 30 November 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: