Выполняйте функцию только один раз при вызове метода в нескольких потоках в C#.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Выполняйте функцию только один раз при вызове метода в нескольких потоках в C#.

Сообщение Anonymous »

У меня есть класс из сборки, загружаемый во время выполнения, экземпляр которого создается с использованием отражения (и, следовательно, с использованием конструктора без параметров) в нескольких потоках (с использованием каналов). Каждый поток создает экземпляр класса, а затем вызывает метод() с набором аргументов.
Один из аргументов содержит лицензионные ключи, которые могут понадобиться плагину для используйте его плагины. Этот ключ следует применять только один раз.
Моя текущая реализация использует блокировку с двойной проверкой:
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()
Многие из них говорят о шаблоне Singleton и его замене такой код с Lazy, но мне нужно передать ключи в метод и заключить с ними первую сделку по исполнению. Я не думаю, что это возможно с Lazy. Возможно, есть другой встроенный класс, который делает это возможным?
Изменить: добавлено _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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»