Один из аргументов содержит лицензионные ключи, которые могут понадобиться плагину для используйте его плагины. Этот ключ следует применять только один раз.
Моя текущая реализация использует блокировку с двойной проверкой:
private static bool _IsLicenceApplied;
private readonly static object _IsLicenceAppliedInitializationLock = new object();
public void Method(Keys keys, object data)
{
if(!_IsLicenceApplied)
{
lock(_IsLicenceAppliedInitializationLock)
{
if(!_IsLicenceApplied)
{
Apply(keys);
_IsLicenceApplied = true;
}
}
}
//do the rest of the method using data
}
Я прочитал бесчисленное количество ответов SO, сообщений в блогах и документации, которые содержат противоречивую информацию и мнения о том:
- _IsLicenceApplied должен быть нестабильным
- _IsLicenceApplied следует читать и записывать с использованием методов класса Volatile
- аналогично, но с использованием класса Interlocked
- Я должен окружить блок вызовами Thread.MemoryBarrier()
Изменить: добавлено _IsLicenceApplied = true; после вызова Apply().
Изменить 2: возможное решение после прочтения исходного кода LazyInitializer (который я мог бы использовать вместо этого?):
private static bool _IsLicenceApplied;
private static object _IsLicenceAppliedInitializationLock = new object();
public void Method(Keys keys, object data)
{
if(!Volatile.Read(_IsLicenceApplied))
{
lock(_IsLicenceAppliedInitializationLock)
{
if(!Volatile.Read(_IsLicenceApplied))
{
Apply(keys);
Volatile.Write(ref _IsLicenceApplied, true);
}
}
}
//do the rest of the method using data
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... in-c-sharp