Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir iş parçacığı ve uygulama etki alanına özgü verileri depolamak için yönetilen iş parçacığı yerel depolama alanını (TLS) kullanabilirsiniz. .NET, yönetilen TLS'yi kullanmak için iki yol sağlar: iş parçacığına bağlı statik alanlar ve veri yuvası alanları.
Derleme zamanında tam gereksinimlerinizi öngörebiliyorsanız, iş parçacığı göreli statik alanları (Visual Basic'te iş parçacığı göreli
Sharedalanları) kullanın. İş parçacığı göreli statik alanlar en iyi performansı sağlar. Ayrıca derleme zamanı türü denetiminin avantajlarından da yararlanabilirsiniz.Gerçek gereksinimleriniz yalnızca çalışma zamanında ortaya çıkabilirken veri slotlarını kullanın. Veri yuvaları, iş parçacığı göreli statik alanlara göre daha yavaş ve kullanımı daha zahmetli ve veriler Object türünde depolanır, bu nedenle kullanmadan önce doğru türe dönüştürülmesi gerekir.
Yönetilmeyen C++'da, yuvaları dinamik olarak ayırmak için TlsAlloc kullanırsınız ve bir değişkenin iş parçacığı göreli depolamada tahsis edilmesi gerektiğini bildirmek için __declspec(thread) kullanırsınız. İş parçacığına özgü statik alanlar ve veri yuvaları bu davranışın yönetilen sürümünü sağlar.
sınıfını System.Threading.ThreadLocal<T> kullanarak, nesne ilk kez kullanıldığında gevşek bir şekilde başlatılan iş parçacığı yerel nesneleri oluşturabilirsiniz. Daha fazla bilgi için bkz. gecikmeli başlatma.
Yönetilen TLS'de Verilerin Benzersizliği
İş parçacığı göreli statik alanları veya veri yuvaları kullanmanız fark etmeksizin, yönetilen TLS'deki veriler iş parçacığı ve uygulama etki alanı birleşimine özeldir.
Bir uygulama etki alanında, her iki iş parçacığı da aynı alanı veya yuvayı kullansa bile, bir iş parçacığı başka bir iş parçacığındaki verileri değiştiremez.
Bir iş parçacığı birden çok uygulama etki alanından aynı alan veya bellek yuvasına eriştiğinde, her uygulama etki alanında farklı bir değer tutulur.
Örneğin, bir iş parçacığı göreli statik alanın değerini ayarlar, başka bir uygulama etki alanı girer ve sonra alanın değerini alırsa, ikinci uygulama etki alanında alınan değer ilk uygulama etki alanındaki değerden farklıdır. İkinci uygulama etki alanındaki alan için yeni bir değer ayarlamak, alanın ilk uygulama etki alanındaki değerini etkilemez.
Benzer şekilde, bir iş parçacığı iki farklı uygulama etki alanında aynı adlandırılmış veri yuvasını aldığında, ilk uygulama etki alanındaki veriler ikinci uygulama etki alanındaki verilerden bağımsız kalır.
Thread-Relative Statik Alanlar
Bir veri parçasının her zaman iş parçacığı ve uygulama etki alanı kombinasyonu için benzersiz olduğunu biliyorsanız, ThreadStaticAttribute özniteliğini statik alana uygulayın. Alanını, başka bir statik alanı kullandığınız gibi kullanın. Alandaki veriler, onu kullanan her iş parçacığı için benzersizdir.
İş parçacığına göre statik alanlar, veri yuvalarına oranla daha iyi performans sağlar ve derleme zamanı tür denetimi avantajına sahiptir.
Herhangi bir sınıf oluşturucu kodunun alana erişen ilk bağlamdaki ilk iş parçacığında çalıştırılacağını unutmayın. Aynı uygulama etki alanındaki diğer tüm iş parçacıklarında veya bağlamlarda, alanlar başvuru türleriyse null (Nothing Visual Basic'te) veya değer türleriyse varsayılan değerlerine başlatılır. Bu nedenle, iş parçacığı bağlamlı statik alanları başlatmak için sınıf oluşturucularına güvenmemelisiniz. Bunun yerine, iş parçacığı göreli statik alanları başlatmaktan kaçının ve bunların null (Nothing) veya varsayılan değerlerine ayarlandığını varsayın.
Veri Yuvaları
.NET, iş parçacığı ve uygulama etki alanı birleşimine özgü dinamik veri yuvaları sağlar. İki tür veri yuvası vardır: adlandırılmış yuvalar ve adlandırılmamış yuvalar. Her ikisi de LocalDataStoreSlot yapısı kullanılarak uygulanır.
Adlandırılmış veri yuvası oluşturmak için Thread.AllocateNamedDataSlot veya Thread.GetNamedDataSlot yöntemini kullanın. Mevcut bir adlandırılmış slota başvuru almak için, adını GetNamedDataSlot metoduna geçirin.
Adlandırılmamış bir veri yuvası oluşturmak için yöntemini kullanın Thread.AllocateDataSlot .
Hem adlandırılmış hem de adlandırılmamış yuvalar için, bilgileri ayarlamak ve almak amacıyla Thread.SetData ve Thread.GetData yöntemlerini kullanın. Bunlar, şu anda onları yürüten iş parçacığının verileri üzerinde her zaman hareket eden statik yöntemlerdir.
Adlandırılmış yuvalar kullanışlı olabilir, çünkü ihtiyaç duyduğunuzda yönteme adını GetNamedDataSlot geçirerek, adlandırılmamış bir yuvaya başvuru tutmak yerine yuvayı alabilirsiniz. Ancak, başka bir bileşen iş parçacığı göreli depolaması için aynı adı kullanırsa ve bir iş parçacığı hem bileşeninizden hem de diğer bileşenden kod yürütürse, iki bileşen birbirlerinin verilerini bozabilir. (Bu senaryoda, her iki bileşenin de aynı uygulama etki alanında çalıştığı ve aynı verileri paylaşmak için tasarlanmadıkları varsayılır.)