[ThreadStatic]
didefinisikan menggunakan atribut sementara ThreadLocal<T>
menggunakan generik. Mengapa solusi desain yang berbeda dipilih? Apa keuntungan dan kerugian menggunakan atribut generik over dalam kasus ini?
c#
generics
attributes
thread-local
threadstatic
pengguna2341923
sumber
sumber
Jawaban:
Sesuatu yang dicatat oleh posting blog di komentar tidak membuatnya eksplisit, tetapi menurut saya sangat penting, adalah itu
[ThreadStatic]
tidak secara otomatis menginisialisasi hal-hal untuk setiap utas. Misalnya, Anda memiliki ini:Utas pertama yang menggunakan ini akan melihat
Foo
diinisialisasi ke42
. Tetapi utas berikutnya tidak akan. Penginisialisasi hanya berfungsi untuk utas pertama. Jadi Anda akhirnya harus menulis kode untuk memeriksa apakah sudah diinisialisasi.ThreadLocal<T>
memecahkan masalah itu dengan membiarkan Anda menyediakan fungsi inisialisasi (seperti yang ditunjukkan blog Reed) yang dijalankan sebelum pertama kali item tersebut diakses.Menurut pendapat saya, tidak ada keuntungan menggunakan
[ThreadStatic]
daripadaThreadLocal<T>
.sumber
ThreadLocal<T>
tersedia di NET 4 dan atas, dan yangThreadStatic
atribut juga tersedia dalam 3.5 dan bawah.ThreadLocal<T>
menerapkanIDisposable
dan biasanya memaksa Anda untuk menerapkanIDisposable
juga, yang memaksa penelepon Anda untuk membuang Anda dan karena itu menerapkannyaIDisposable
juga ...ThreadLocal
atauThreadStatic
dengan utas kumpulan. Nilai-nilai tersebut akan tetap ada sepanjang masa pakai utas kumpulan, tidak hanya untuk tugas yang Anda tetapkan. Itu dapat menyebabkan masalah bagi Anda dalam beberapa cara yang tidak terlalu jelas. Lihat stackoverflow.com/questions/561518/… dan pertanyaan serupa untuk info lebih lanjut.static
? Lihat msdn.microsoft.com/en-us/library/…ThreadStatic Inisialisasi hanya pada utas pertama, ThreadLocal Inisialisasi untuk setiap utas. Di bawah ini adalah demonstrasi sederhana:
sumber
Ide utama di balik ThreadStatic adalah mempertahankan salinan variabel terpisah untuk setiap utas .
Dalam cuplikan di atas, kami memiliki salinan terpisah
value
untuk setiap utas, termasuk utas utama.Jadi, variabel ThreadStatic akan diinisialisasi ke nilai defaultnya di utas lain kecuali utas tempat ia dibuat.
Jika kita ingin menginisialisasi variabel pada setiap utas dengan cara kita sendiri, gunakan ThreadLocal.
sumber