Разница между Lazy <T>и LazyInit <T> - PullRequest
4 голосов
/ 22 марта 2011

У меня была следующая строка в классе, который я использовал.

 private static readonly LazyInit<TestClass> _instance = new LazyInit<TestClass>(() => new TestClass(), LazyInitMode.EnsureSingleExecution);

Однажды я захотел воспользоваться всеми новыми возможностями, которые входят в .NET 4, установил его, и ад сломался.

Мой LazyInit больше не работал.Таким образом, я заменил каждый случай на Lazy , но как насчет LazyInitMode.EnsureSingleExecution?

Я думал, что это будет LazyThreadSafetyMode.ExecutionAndPublication.

private static Lazy<LookupService> s_instance = new Lazy<LookupService>(() => new LookupService(), LazyThreadSafetyMode.ExecutionAndPublication);

Являются ли эти два уклонения равноправными?

1 Ответ

6 голосов
/ 22 марта 2011

Эффективно, да.Устанавливая LazyThreadSafetyMode.ExecutionAndPublication, вы говорите, что вы хотите, чтобы только один поток мог создавать Lazy<T>, что фактически «обеспечивает единственное выполнение» на этапе построения.PublicationOnly позволит нескольким потокам запускать конструктор, но сохранить только один результат (первый завершен).

...