В своём наследнике Strategy делаете поле int _inUse;
В начале переопределённого OnProcess() пишете примерно так:
int inUse = Interlocked.CompareExchange(ref _inUse, 1, 0);
if (inUse == 0)
{
try
{
// ваша логика
finally
{
Interlocked.Exchange(ref _inUse, 0);
Это самый эффективный способ блокирования от параллельной работы. Ещё
есть метод для ленивых, с семафором. Объявляете филд SemaphoreSlim
_lock = new SemaphoreSlim(1,1);
В OnProcess примерно так:
if (_lock.Wait(0))
{
try
{
// логика
finally
{
_lock.Release();
Короче на одну строку, меньше цифр, а разницу в скорости вы никогда в
жизни не увидите.