İş Parçacığında Yerel Depolama: İş Parçacığı Göreli Statik Alanları ve Veri Yuvaları

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ığı göreli statik alanlar ve veri yuvaları.

  • Derleme zamanında tam gereksinimlerinizi öngörebiliyorsanız, iş parçacığı göreli statik alanları (Visual Basic'te iş parçacığı göreli Shared alanları) 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 bulunabilirken veri yuvalarını kullanın. Veri yuvaları, iş parçacığı göreli statik alanlara göre daha yavaş ve kullanımı daha gariptir ve veriler türü Objectolarak depolanır, bu nedenle kullanmadan önce doğru türe dönüştürmeniz gerekir.

Yönetilmeyen C++'da, yuvaları dinamik olarak ayırmak ve __declspec(thread) bir değişkenin iş parçacığı göreli depolamada ayrılması gerektiğini bildirmek için kullanırsınızTlsAlloc. İş parçacığı göreli 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ı alana veya yuvaya eriştiğinde, her uygulama etki alanında ayrı 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.

İş Parçacığı Göreli Statik Alanları

Bir veri parçasının her zaman iş parçacığı ve uygulama etki alanı bileşimi için benzersiz olduğunu biliyorsanız, özniteliğini statik alana uygulayın ThreadStaticAttribute . 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ığı göreli statik alanlar, veri yuvalarından 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 (Nothing Visual Basic'te) veya değer türleriyse varsayılan değerlerine başlatılır null . Bu nedenle, iş parçacığı göreli 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 () veya varsayılan değerlerine başlatıldıklarını nullNothingvarsayalım.

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 yapısı kullanılarak LocalDataStoreSlot uygulanır.

Hem adlandırılmış hem de adlandırılmamış yuvalar için yuvadaki Thread.SetData bilgileri ayarlamak ve almak için 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 adını yönteme 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.)

Ayrıca bkz.