Aracılığıyla paylaş


LazyThreadSafetyMode Sabit listesi

Tanım

Lazy<T> örneğinin 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

Name Değer Description
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 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 T oluşturucu tarafından oluşan özel durumlar önbelleğe alınmaz. Bu durumda, özelliğine Value yapılan 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ı tamamlayan 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. Rakip iş parçacıkları tarafından oluşturulan tüm örnekleri T atılır. Başlatılan değerin yayımlanması, başlatılan değerlerden yalnızca birinin tüm iş parçacıkları tarafından yayımlanıp 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ğin dışına 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.

ExecutionAndPublication 2

Kilitler, yalnızca tek bir iş parçacığının bir örneği iş parçacığı güvenli bir şekilde başlatabilmesini Lazy<T> sağlamak için kullanılır. Başlatma yöntemi etkili bir şekilde iş parçacığı güvenli bir şekilde yürütülür (alan adında olarak Execution adlandırılır). Publication yalnızca bir değerin yayımlanıp tüm iş parçacıkları tarafından kullanılabilmesi açısından, başlatılan değerin 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 T oluşturucu tarafından oluşan özel durumlar önbelleğe alınmaz. Bu durumda, özelliğine Value yapılan 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.

Açıklamalar

Oluşturucuların parametresini belirtmek için bu numaralandırmayı modeLazy<T> kullanın. Tüm oluşturucuların iş parçacığı eşitlemesi üzerindeki etkileri, parametreleri olup olmadıklarına mode bakılmaksızın bu numaralandırma açısından açıklanabilir.

Bir Lazy<T> örnek, kullanıcı tarafından belirtilen bir başlatma yöntemiyle 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 belirtmeye Lazy<T> ek olarak, bu numaralandırma özel durum önbelleğe almayı etkiler. Bir Lazy<T> örnek için özel durumlar önbelleğe alındığında ö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. Özel durumları önbelleğe almanı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. None veya ExecutionAndPublication belirttiğinizde, önbelleğe alma işlemi bir başlatma yöntemi belirtmenize veya parametresiz oluşturucunun T kullanılmasına izin vermenize 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 T için veya Visual Basic'te new Lazy<Contents>(() => new Contents(), mode) parametresiz oluşturucuyu çağırabilir: New Lazy(Of Contents)(Function() New Contents()). Başlatma yöntemi belirtmeyen bir oluşturucu kullanırsanız, parametresiz T oluşturucu tarafından oluşan özel durumlar önbelleğe alınmaz. Aşağıdaki tabloda özel durum önbelleğe alma davranışı özetlemektedir.

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

Şunlara uygulanır

Ayrıca bkz.