Завершить lock блокировку по таймауту

201
13 сентября 2018, 14:40

Необходимо сделать блокировку, ограниченную по времени, например 1 секунду. В теле блокировки я делаю задержку на 2 секунды (умышленно):

  1. Начало блокировки с ограничением в 1 секунду
  2. Заведомо долгая операция превышающая 1 секунду
  3. Конец блокировки

Так вот, можно ли каким то образом, прервать выполнение кода внутри тела блокировки по таймауту (принудительно остановить выполнение пункта 2, завершить блокировку), и выкинуть исключение о превышении таймаута?

Вычитал что в шарпе обычный lock(object) { ... } не имеет таймаута, но, есть: Monitor.TryEnter(object, timeout), который, я так подозреваю, проверяет таймаут на этапе постановки в очередь. (так ли это?)

Отдельно поясню по содержимому тела блокировки (всё то что идёт между lock и unlock вызовами) - это не множество мелких операций, а несколько достаточно продолжительных по времени (сферический пример в вакууме - пара вызовов функции скачивания 10ГиБ файла).

Подскажите, есть готовые механизмы или сахар в шарпе, решающие мою задачу, или, всё же, придётся самостоятельно в отдельном потоке мониторить, и по таймауту принудительно завершать поток? (что значительно увеличит объёмы кода и сложность, казалось бы, такой простой вещи)

Answer 1

Для этой задачи нет встроенной фишки, а в Monitor.TryEnter и в похожих на него методах указывается не время, которое у него есть на работы с заблокированным объектом, а время в течении которого он блокирует текущий поток и пытается получить эту блокировку, если он получает её сразу, то никакой задержки не происходит.
А вашу задачу (если верить сферическому примеру в вакууме), можно реализовать с помощью Thread.Join указав ему период времени и завершив поток по его истечении.

READ ALSO
Замена кода применяемого в WPF в Winows Forms C#

Замена кода применяемого в WPF в Winows Forms C#

Переношу код с WPF на Windows Forms и столкнулся с такой проблемойЕсть класс - который получает контекст от основного окна в конструктор

201
SOAP или RESTAPI для написания своего API на c#?

SOAP или RESTAPI для написания своего API на c#?

Существует задача: написать свой API для приложения на C#, вопрос очень простой как это лучше реализовать, какие технологии использовать? В процессе...

190
C# работа с базой

C# работа с базой

Ребят, рассчитываю на ваш опыт!

189