Я работаю над каким-то большим многопоточным проектом, теперь вчера у меня возникла тупиковая ситуация (мой первый в истории), и я отследил ее, добавив Console.WriteLine ("FunctionName: Lock on VariableName") и Console.WriteLine («Имя_функции: разблокировка имени-переменной»). Добавление всего этого было довольно сложной работой.
Прежде всего, в программе есть основной цикл, который выполняется 2 раза в секунду, и этот цикл заставляет некоторые другие потоки завершить свою работу после обработки основного цикла. Теперь произошло то, что у меня был один поток в состоянии ожидания для пульсации, когда он был импульсным, он вызвал другой метод, который также ожидал, чтобы получить импульс, но импульс уже произошел, и поток не будет пульсировать снова, пока действие фактически завершено.
Теперь я хочу переопределить функции Monitor.Enter и Monitor.Exit, не заключая их в класс.
Я много слышал об Reflection, но я не знаю, как применить его для этой цели, я знаю, что самый простой способ достичь всего этого - просто использовать класс-обертку, но тогда ключевое слово lock больше не будет работать, и мне придется преобразовать все блокировки в Monitor.Enter try {} finally {Monitor.Exit}, это огромный объем работы.
Итак, мой вопрос: как переопределить функции Monitor.Enter и Monitor.Exit, сохраняя доступ к базовой функции для фактической блокировки?
И если это невозможно: как переопределить оператор блокировки для вызова моего класса-оболочки вместо функций Monitor.Enter и Monitor.Exit?
РЕДАКТИРОВАТЬ ДЛЯ ЯРКОСТИ:
Я запрашиваю это только для того, чтобы позволить мне регистрироваться, когда происходят блокировки, чтобы упростить процесс отладки, это также означает, что я не хочу создавать свой собственный механизм блокировки, я просто хочу регистрировать, когда блокировка установлена и когда он выпущен .
Закрытие также не будет выполняться большую часть времени, только когда я столкнусь с проблемой многопоточности.