Bagikan melalui


LazyThreadSafetyMode Enum

Definisi

Menentukan bagaimana instans Lazy<T> menyinkronkan akses di antara beberapa utas.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Warisan
LazyThreadSafetyMode

Bidang

Nama Nilai Deskripsi
None 0

Lazy<T> Instans tidak aman utas; jika instans diakses dari beberapa utas, perilakunya tidak terdefinisi. Gunakan mode ini hanya ketika performa tinggi sangat penting dan instans dijamin Lazy<T> tidak akan pernah diinisialisasi dari lebih dari satu utas. Jika Anda menggunakan Lazy<T> konstruktor yang menentukan metode inisialisasi (valueFactory parameter), dan jika metode inisialisasi tersebut melemparkan pengecualian (atau gagal menangani pengecualian) saat pertama kali Anda memanggil Value properti, maka pengecualian di-cache dan dilemparkan lagi pada panggilan berikutnya ke Value properti. Jika Anda menggunakan konstruktor Lazy<T> yang tidak menentukan metode inisialisasi, pengecualian yang ditampilkan oleh konstruktor tanpa parameter untuk T tidak di-cache. Dalam hal ini, panggilan berikutnya ke Value properti mungkin berhasil menginisialisasi Lazy<T> instans. Jika metode inisialisasi secara rekursif mengakses Value properti Lazy<T> instans, maka InvalidOperationException akan dilemparkan.

PublicationOnly 1

Ketika beberapa utas mencoba menginisialisasi Lazy<T> instans secara bersamaan, semua utas diizinkan untuk menjalankan metode inisialisasi (atau konstruktor tanpa parameter, jika tidak ada metode inisialisasi). Utas pertama untuk menyelesaikan inisialisasi menetapkan nilai Lazy<T> instans. Ini disebut sebagai Publication dalam nama bidang. Nilai tersebut dikembalikan ke utas lain yang secara bersamaan menjalankan metode inisialisasi, kecuali metode inisialisasi melemparkan pengecualian pada utas tersebut. Setiap instans T yang dibuat oleh utas yang bersaing dibuang. Secara efektif, publikasi nilai yang diinisialisasi aman dalam arti bahwa hanya salah satu nilai yang diinisialisasi yang dapat diterbitkan dan digunakan oleh semua utas. Jika metode inisialisasi melemparkan pengecualian pada utas apa pun, pengecualian disebarluaskan dari properti pada utas tersebut Value . Pengecualian tidak di-cache. Nilai IsValueCreated properti tetap false, dan panggilan berikutnya ke Value properti, baik oleh utas tempat pengecualian dilemparkan atau oleh utas lain, menyebabkan metode inisialisasi berjalan lagi. Jika metode inisialisasi secara rekursif mengakses Value properti Lazy<T> instans, tidak ada pengecualian yang dilemparkan.

ExecutionAndPublication 2

Kunci digunakan untuk memastikan bahwa hanya satu utas yang dapat menginisialisasi instans dengan Lazy<T> cara yang aman untuk utas. Secara efektif, metode inisialisasi dijalankan dengan cara yang aman utas (disebut sebagai Execution dalam nama bidang). Publication dari nilai yang diinisialisasi juga aman utas dalam arti bahwa hanya satu nilai yang dapat diterbitkan dan digunakan oleh semua utas. Jika metode inisialisasi (atau konstruktor tanpa parameter, jika tidak ada metode inisialisasi) menggunakan kunci secara internal, kebuntuan dapat terjadi. Jika Anda menggunakan Lazy<T> konstruktor yang menentukan metode inisialisasi (valueFactory parameter), dan jika metode inisialisasi tersebut melemparkan pengecualian (atau gagal menangani pengecualian) saat pertama kali Anda memanggil Value properti, maka pengecualian di-cache dan dilemparkan lagi pada panggilan berikutnya ke Value properti. Jika Anda menggunakan konstruktor Lazy<T> yang tidak menentukan metode inisialisasi, pengecualian yang ditampilkan oleh konstruktor tanpa parameter untuk T tidak di-cache. Dalam hal ini, panggilan berikutnya ke Value properti mungkin berhasil menginisialisasi Lazy<T> instans. Jika metode inisialisasi secara rekursif mengakses Value properti Lazy<T> instans, maka InvalidOperationException akan dilemparkan.

Keterangan

Gunakan enumerasi ini untuk menentukan mode parameter Lazy<T> konstruktor. Efek dari semua konstruktor pada sinkronisasi utas dapat dijelaskan dalam hal enumerasi ini, apakah mereka memiliki mode parameter atau tidak.

Lazy<T> Instans diinisialisasi baik oleh metode inisialisasi yang ditentukan pengguna atau oleh konstruktor tanpa parameter untuk T. Metode inisialisasi ditentukan oleh valueFactory parameter Lazy<T> konstruktor. Metode mengembalikan instans T, yang merupakan jenis yang diinstansiasi dengan malas oleh instans Lazy<T>. Jika konstruktor tidak memiliki valueFactory parameter, konstruktor tanpa parameter untuk T digunakan untuk menginisialisasi Lazy<T> instans. Dalam kedua kasus, inisialisasi terjadi saat pertama kali Anda memanggil Lazy<T>.Value properti.

Selain menentukan keamanan Lazy<T> utas instans, enumerasi ini memengaruhi penembolokan pengecualian. Ketika pengecualian di-cache untuk Lazy<T> instans, Anda hanya mendapatkan satu kesempatan untuk menginisialisasi instans. Jika pengecualian dilemparkan saat pertama kali Anda memanggil properti , pengecualian tersebut Lazy<T>.Value di-cache dan ditumbuhi kembali pada semua panggilan berikutnya ke Lazy<T>.Value properti . Keuntungan dari pengecualian penembolokan adalah bahwa dua utas selalu mendapatkan hasil yang sama, bahkan ketika kesalahan terjadi.

Saat Anda menentukan mode PublicationOnly, pengecualian tidak pernah di-cache. Saat Anda menentukan None atau ExecutionAndPublication, penembolokan tergantung pada apakah Anda menentukan metode inisialisasi atau mengizinkan konstruktor tanpa parameter untuk T digunakan. Mengatur metode inisialisasi memungkinkan pencachingan pengecualian untuk kedua mode ini. Metode inisialisasi bisa sangat sederhana. Misalnya, ini mungkin memanggil konstruktor tanpa parameter untuk T: new Lazy<Contents>(() => new Contents(), mode) di C#, atau New Lazy(Of Contents)(Function() New Contents()) di Visual Basic. Jika Anda menggunakan konstruktor yang tidak menentukan metode inisialisasi, pengecualian yang dilemparkan oleh konstruktor tanpa parameter untuk T tidak di-cache. Tabel berikut ini meringkas perilaku penembolokan pengecualian.

Modus Menggunakan metode inisialisasi Menggunakan konstruktor tanpa parameter untuk T
Tidak Cache Tidak di-cache
PublicationOnly Tidak di-cache Tidak di-cache
ExecutionAndPublication Cache Tidak di-cache

Berlaku untuk

Lihat juga