- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
private long m_IsExecuting;
// ...
public virtual void Execute(object parameter)
{
try
{
if (Interlocked.Read(ref m_IsExecuting) != 0)
return;
Interlocked.Increment(ref m_IsExecuting);
m_Execute(parameter);
}
finally
{
Interlocked.Decrement(ref m_IsExecuting);
}
}
Класс Interlocked гарантирует атомарность операция только в своих методах, поэтому при переключении потоков между 9 и 11 строкой ваша блокировка идёт по пизде.
Но патч в виде
вместо строк 9 - 11 решил бы сразу две проблемы
Но пропуск каждого второго выглядит забавнее :)
Неприятность возникнет только в случае необработанного исключения, поскольку секции catch у нас нет. Тогда выполнение может быть заблокировано навсегда.
Я решил подстраховаться, потому что тут было предупреждение:
https://msdn.microsoft.com/ru-ru/library/zwc8s4fz.aspx
Но там уже про крайний случай, когда приложение должно аварийно завершиться.
Какие-то взаимоисключающие параграфы...
Windows производит настройку самонастраивающихся устройств.