'daki güvenli koleksiyonları iş parçacığı Güvenli bir koleksiyona (örneğin, Set) ihtiyaç duyulduğunda günümüzde standart nedir. Bunu kendim mi senkronize edebilirim veya dahili olarak güvenli bir koleksiyon var mı?.NET
.NET
cevap
.NET 4.0 Framework System.Collections.Concurrent Namespace birkaç evreli koleksiyonlarını tanıttı:
ConcurrentBag<T>
aynı anda birden fazla parçacığı tarafından erişilebilen bir anahtar değer çiftleri evreli toplama temsil eder. bir evreli ilk giren ilk çıkar (FIFO) koleksiyonunu temsil eder. giren ilk çıkar (LIFO) koleksiyon evreli sondan temsil eder. .NET Framework içinde
nesnelerin evreli, sırasız koleksiyon temsil eder.
Diğer koleksiyonlar-iplik güvenli varsayılan olarak ve her operasyon için kilitlenmesi gerektiğini değildir:
lock (mySet)
{
mySet.Add("Hello World");
}
İplik güvenli bir koleksiyon oluştururken ReaderWriterLockSlim kullanmayı tercih edebilirsiniz. – SandRock
.NET 4 evreli koleksiyonları kümesi sağlar System.Collections.Concurrent
Pre. Net 4.0 altında .Net koleksiyonlarının çoğunda thread güvenli değil.
Koleksiyonlar sınıflar yapılabilir güvenli iplik aşağıdaki yöntemlerden birini kullanarak:
oluştur makaleden http://msdn.microsoft.com/en-us/library/573ths2x.aspx
Alıntı: Sen senkronizasyonu işlemek için bazı işler kendiniz yapmak gerekecek Senkronize yöntemini kullanarak bir iş parçacığı güvenli sarıcı kullanın ve koleksiyonuna yalnızca bu sarıcısından erişin.
sınıf bir Senkronize yöntem yoksa
, sınıftan türetmek ve SyncRoot özelliğini kullanarak Senkronize yöntemi uygulamak. koleksiyonunu erişirken SyncRoot mülkiyet, C# ( Visual Basic SyncLock) içinde kilit ifadesi olarak, bir kilitleme mekanizması kullanın. Sync Root Property
olarak Lock StatementObject thisLock = new Object(); ...... lock (thisLock) { // Critical code section }
.4.0 net System.Collections.Concurrent ad
Blocking Collection
Concurrent Bag
Concurrent Queue
Concurrent Dictionary
Ordable Partitioner
System.Collections.Concurrent
çok yararlı sınıflar için bir ek olarak Partitioner
Partitioner T
Kilitlemekte olduğunuz nesne bir örnek değişkeni olmalıdır, aksi halde mantıklı değildir çünkü her zaman yeni bir referansı kilitlersiniz. – Femaref
Bu doğru. Bu, Kilit kodunun kullanıldığı MSDN sayfasında bulunan bir örnektir. – kemiller2002
, çoğunlukla bir standart teknik, kişiye -de-nadiren-değişim sc Enarios (ya da ancak sık, ama eşzamanlı olmayan yazıyorsa). Net için de geçerlidir. Copy-on-write denir.
Oldukça-eşzamanlı programlarda arzulanan özellikleri bir çift vardır: kendilerini değişmez (yani evreli, güvenli kilitleme olmadan sayılabilir) olan
- toplama nesne örnekleri
- modifikasyonunu alabilir o, performans ve
Sınırlama: Eşzamanlı yazımlar varsa, değişikliklerin yeniden denenmesi gerekebilir, bu nedenle daha fazla yazılan yazma sayısı o kadar az olur. (Yani işte optimistic concurrency var)
Düzenleme Scott Chamberlain'in comment orada başka sınırlama olduğunu hatırlattı: Veri yapıları çok büyük değilse ve modifikasyonlar bir kopyası-hepsi üzerinde yazma açısından hem yasaklayıcı olabilir, sık sık meydana hafıza tüketimi ve kopyalamanın CPU maliyeti dahil.
Microsoft, [Microsoft.Bcl.Immutable] (https://www.nuget.org/packages/Microsoft.Bcl.Immutable) aracılığıyla, NuGet aracılığıyla bir dizi yazıştırma koleksiyonları sağlar. Daha fazla bilgi bulabilirsiniz. (http://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable-collections-released-on-nuget.aspx) –
@ScottChamberlain Theirs basitliğimden çok daha karmaşıktır ancak jenerik, "yazının tümünü kopyala" yaklaşımı, verilerin yalnızca bir kısmını kopyaladıkları için. Bu nedenle, her ikisi de kopyalamanın CPU maliyeti ve bellekte birden fazla tam kopya tutmanın bellek tüketimi açısından, herşeyi bir arada kopyalama ile etkisiz olacak olan büyük veri yapılarını bile değiştirebilirler. –
- 1. .NET
- 2. .NET
- 3. .NET
- 4. .NET
- 5. .NET
- 6. .Net
- 7. .NET
- 8. .net
- 9. .net
- 10. . Net
- 11. .Net
- 12. .Net
- 13. .NET
- 14. .NET
- 15. NET
- 16. .net
- 17. .Net
- 18. .NET
- 19. .NET
- 20. .NET
- 21. .NET
- 22. .NET
- 23. .NET
- 24. .NET
- 25. .NET
- 26. .NET/Jenkins ile dağıtımı .NET
- 27. .NET üzerinden ekran kazıması .NET
- 28. .NET 3.5 uygulamalarını yalnızca .NET 4 üzerinde çalıştıran .NET sistemleri
- 29. .NET 2.0, .NET 3.5 yükleyicisine dahil mi?
- 30. .Net KeyEventArgs bir C# .net uygulamasında
Hangi operasyonlar için güvenlidir? –
@John, bildiğiniz gibi, ekleyerek, okuyorsunuz… java'nın eşzamanlı koleksiyonları gibi bir şey. – ripper234
Sorunuzu bu bilgilerle güncellemeniz gerekir. Her şey için iş parçacığı güvenli olan koleksiyonlar, örneğin, yalnızca insert eklemek için güvenli bir koleksiyona sahip olmak istediğiniz büyük bir fark yaratır. –