Выполняйте функцию только один раз при вызове метода в нескольких потоках в 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);
}
}
}
//do the rest of the method using data
}
Я прочитал бесчисленное количество ответов SO, сообщений в блогах и документации, которые содержат противоречивую информацию и мнения о том:
  • Код: Выделить всё

    _IsLicenceApplied
    должен быть нестабильным
  • Код: Выделить всё

    _IsLicenceApplied
    следует читать и записывать с использованием методов класса Volatile
  • аналогично, но с использованием класса Interlocked
  • Я должен окружить блок вызовами Thread.MemoryBarrier()
Многие из них говорят о шаблоне Singleton и его замене такой код с Lazy, но мне нужно передать ключи в метод и заключить с ними первую сделку по исполнению. Я не думаю, что это возможно с Lazy. Возможно, есть другой встроенный класс, который делает это возможным?

Подробнее здесь: https://stackoverflow.com/questions/792 ... in-c-sharp
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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