2008-09-25 20 views
9

ThreadStatic attribute, iş parçacığı başına bir statik değişkeni bildirir. Bu tür değişkenleri doğru şekilde atmak için kolay bir desen biliyor musunuz?ThreadStatic nesnelerinin deterministik atılması

Daha önce kullandığımız ThreadStatic bir ThreadContextManager'tır. Her iş parçacığına tüm iş parçacığına özgü bilgileri koruyan bir ThreadContext tahsis edildi. Bazı iplikler ürettik ve işlerine izin verdik. Daha sonra, hepsi bittiğinde, ThreadContentManager'ı bertaraf ettik, ki bu da tüm bağlamları, eğer tek kullanımlık ise, bertaraf ettik.

Bu deseni ThreadStatic nesnelerine çevirmenin hemen bir yolunu göremiyorum. Nesneler nihai olarak bertaraf edilecektir, çünkü dişler ölür ve hiçbir şey onlara referans olmaz. Bununla birlikte, mümkün olduğunda deterministik imhayı tercih ederiz.

Güncelleme

Gerçekten doğrudan konuları kontrol etmiyoruz - Ben görevleri yapan bir ThreadPool'da sahip Microsoft CCR, kullanıyorum. Tüm görevler bittiğinde, Dispatcher'ı (threadpool'u tutan) imha ediyorum. Mesele şu ki - bir iş parçacığının ana işlevinin sonunda bir şey yapma şansı bulamıyorum - bu yüzden iş parçacığının çalışmasının sonunda işleri elimden atamıyorum. İş parçacığının statik nesnelerine iş parçacığının dışından bir şekilde erişebilir miyim?

cevap

1

Ayrıca, imha işlemek için ThreadContextManager sınıfınızın eşdeğerini kullanabilirsiniz. Yumurtlayan iplikler, bu 'yönetici' nesnesini bertaraf eder, ki bu da bildiği diğer tüm statik nesneleri alır.

Göreceli olarak az sayıda iş parçacığı statik nesnelere sahip olmayı ve bunun yerine bir context nesnesi kullanmayı tercih ediyorum. Bu, iş parçacığına özgü durumu yalnızca birkaç yerde tutar ve bu şekilde kalıpları kolaylaştırır.

Güncelleştirme: iş parçacığı işlemek için iş parçacığı havuzu geçirdiğiniz bir temel 'görev' nesnesi oluşturabilir. Kodunuzun ihtiyaç duyduğu herhangi bir jenerik başlatma işlemini gerçekleştirebilir, 'gerçek' görevi yerine getirebilir ve ardından gerekli herhangi bir temizleme işlemini gerçekleştirebilir.

+0

Her görevden sonra temizlemek istemiyorum. Threadpool'umdaki herhangi bir iş parçacığı sırayla birçok görevi yerine getirir. Bağlamın nedeni, görev başına veri yapılarının pahalı tahsisini kurtarmaktır. Bu sadece tüm iş parçacığı bittikten sonra temizleyebileceğim anlamına gelir. – ripper234

İlgili konular