LazyThreadSafetyMode Sabit listesi

Tanım

Bir Lazy<T> örneğin birden çok iş parçacığı arasında erişimi nasıl eşitleyeni belirtir.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Devralma
LazyThreadSafetyMode

Alanlar

ExecutionAndPublication 2

Kilitler, yalnızca tek bir iş parçacığının örneği iş parçacığı açısından güvenli bir Lazy<T> şekilde başlatabilmesini sağlamak için kullanılır. Etkili bir şekilde, başlatma yöntemi iş parçacığı açısından güvenli bir şekilde yürütülür (alan adında olarak Execution adlandırılır). Publication başlatılan değerin yalnızca bir değerin yayımlanıp tüm iş parçacıkları tarafından kullanılabilmesi açısından iş parçacığı açısından da güvenlidir. Başlatma yöntemi (veya başlatma yöntemi yoksa parametresiz oluşturucu) dahili olarak kilitler kullanıyorsa kilitlenmeler oluşabilir. Bir başlatma yöntemi (valueFactoryparametre) belirten bir Lazy<T> oluşturucu kullanırsanız ve bu başlatma yöntemi özelliği ilk kez çağırdığınızda Value bir özel durum oluşturursa (veya bir özel durumu işleyemezse), özel durum önbelleğe alınır ve özelliğine Value yapılan sonraki çağrılarda yeniden oluşturulur. Başlatma yöntemi belirtmeyen bir Lazy<T> oluşturucu kullanırsanız parametresiz oluşturucu T tarafından oluşan özel durumlar önbelleğe alınmaz. Bu durumda, özelliğine yapılan Value sonraki bir çağrı örneği başarıyla başlatabilir Lazy<T> . Başlatma yöntemi yinelemeli olarak örneğin özelliğine ValueLazy<T> erişirse, bir InvalidOperationException oluşturulur.

None 0

Örnek Lazy<T> iş parçacığı güvenli değildir; örneğe birden çok iş parçacığından erişilirse, davranışı tanımlanmamıştır. Bu modu yalnızca yüksek performans kritik öneme sahip olduğunda ve Lazy<T> örneğin hiçbir zaman birden fazla iş parçacığından başlatılmayacağı garanti edildiğinde kullanın. Bir başlatma yöntemi (valueFactoryparametre) belirten bir Lazy<T> oluşturucu kullanırsanız ve bu başlatma yöntemi özelliği ilk kez çağırdığınızda Value bir özel durum oluşturursa (veya bir özel durumu işleyemezse), özel durum önbelleğe alınır ve özelliğine Value yapılan sonraki çağrılarda yeniden oluşturulur. Başlatma yöntemi belirtmeyen bir Lazy<T> oluşturucu kullanırsanız parametresiz oluşturucu T tarafından oluşan özel durumlar önbelleğe alınmaz. Bu durumda, özelliğine yapılan Value sonraki bir çağrı örneği başarıyla başlatabilir Lazy<T> . Başlatma yöntemi yinelemeli olarak örneğin özelliğine ValueLazy<T> erişirse, bir InvalidOperationException oluşturulur.

PublicationOnly 1

Birden çok iş parçacığı aynı anda bir Lazy<T> örneği başlatmaya çalıştığında, tüm iş parçacıklarının başlatma yöntemini (veya başlatma yöntemi yoksa parametresiz oluşturucuyu) çalıştırmasına izin verilir. Başlatmayı tamamlamak için ilk iş parçacığı, örneğin değerini Lazy<T> ayarlar. Bu, alan adlarında olarak Publication adlandırılır. Bu değer, başlatma yöntemi bu iş parçacıklarında özel durumlar oluşturmadığı sürece başlatma yöntemini aynı anda çalıştıran diğer iş parçacıklarına döndürülür. T Rakip iş parçacıkları tarafından oluşturulan örnekleri atılır. Etkin bir şekilde, başlatılan değerin yayımlanması, başlatılan değerlerden yalnızca birinin yayımlanıp tüm iş parçacıkları tarafından kullanılabilmesi açısından iş parçacığı açısından güvenlidir. Başlatma yöntemi herhangi bir iş parçacığında özel durum oluşturursa, özel durum bu iş parçacığındaki Value özelliğinden yayılır. Özel durum önbelleğe alınmaz. özelliğinin IsValueCreated değeri kalır falseve özel durumun oluşturulduğu iş parçacığı veya diğer iş parçacıkları tarafından özelliğine yapılan sonraki çağrılar Value başlatma yönteminin yeniden çalışmasına neden olur. Başlatma yöntemi yinelemeli olarak örneğin özelliğine ValueLazy<T> erişirse, hiçbir özel durum oluşmaz.

Açıklamalar

Oluşturucuların parametresini belirtmek için bu numaralandırmayı modeLazy<T> kullanın. İş parçacığı eşitlemesi üzerindeki tüm oluşturucuların etkileri, parametreleri olsun veya olmasın mode , bu numaralandırma açısından açıklanabilir.

Bir Lazy<T> örnek, kullanıcı tarafından belirtilen başlatma yöntemi veya parametresiz Toluşturucu tarafından başlatılır. Başlatma yöntemi bir Lazy<T> oluşturucunun valueFactory parametresi tarafından belirtilir. yöntemi, örneği tarafından örneklenen türü olan bir örneğini TLazy<T>döndürür. Bir oluşturucunun parametresi valueFactory yoksa, örneği başlatmak Lazy<T> için parametresiz T oluşturucu kullanılır. Her iki durumda da, özelliği ilk kez çağırdığınızda Lazy<T>.Value başlatma gerçekleşir.

Bir örneğin iş parçacığı güvenliğini Lazy<T> belirtmeye ek olarak, bu numaralandırma özel durum önbelleğe almayı etkiler. Bir Lazy<T> örnek için özel durumlar önbelleğe alınırsa örneği başlatmak için tek bir şansınız olur. Özelliği ilk kez çağırdığınızda Lazy<T>.Value bir özel durum oluşursa, bu özel durum önbelleğe alınır ve özelliğine Lazy<T>.Value yapılan sonraki tüm çağrılarda yeniden oluşturulur. Önbelleğe alma özel durumlarının avantajı, hatalar oluştuğunda bile her iki iş parçacığının her zaman aynı sonucu almasıdır.

PublicationOnly modunu belirttiğinizde, özel durumlar hiçbir zaman önbelleğe alınmaz. Yok veya ExecutionAndPublication belirttiğinizde, önbelleğe alma işlemi bir başlatma yöntemi belirttiğinize veya parametresiz oluşturucunun T kullanılmasına izin verip vermediğinize bağlıdır. Bir başlatma yöntemi belirtmek, bu iki mod için özel durum önbelleğe almayı etkinleştirir. Başlatma yöntemi çok basit olabilir. Örneğin, C# dilinde veya New Lazy(Of Contents)(Function() New Contents()) Visual Basic'te için Tnew Lazy<Contents>(() => new Contents(), mode) parametresiz oluşturucuyu çağırabilir. Başlatma yöntemi belirtmeyen bir oluşturucu kullanırsanız parametresiz oluşturucu T tarafından oluşan özel durumlar önbelleğe alınmaz. Aşağıdaki tabloda özel durum önbelleğe alma davranışı özetlemektedir.

Mod Başlatma yöntemini kullanma için parametresiz oluşturucu kullanma T
Hiçbiri Önbelleğe alınmış Önbelleğe alınmadı
YayınAyrıca Önbelleğe alınmadı Önbelleğe alınmadı
ExecutionAndPublication Önbelleğe alınmış Önbelleğe alınmadı

Şunlara uygulanır

Ayrıca bkz.