Saya punya pertanyaan yang tepat dan saya ingin memahami alasan di balik desain ini.
Jawaban yang diterima mendapatkan alasan yang tepat. Berikut konfirmasi dari tim yang merancang fitur ini (penekanan pada saya):
Dua tipe baru membentuk dasar kerangka kerja: A CancellationToken
adalah struct yang mewakili 'permintaan potensial untuk pembatalan'. Struct ini diteruskan ke pemanggilan metode sebagai parameter dan metode ini dapat melakukan polling atau mendaftarkan callback untuk dipecat ketika pembatalan diminta. A CancellationTokenSource
adalah kelas yang menyediakan mekanisme untuk memulai permintaan pembatalan dan memiliki Token
properti untuk mendapatkan token terkait. Adalah wajar untuk menggabungkan kedua kelas ini menjadi satu, tetapi desain ini memungkinkan dua operasi utama (memulai permintaan pembatalan vs. mengamati dan menanggapi pembatalan) untuk dipisahkan secara bersih. Secara khusus, metode yang hanya mengambil CancellationToken
dapat mengamati permintaan pembatalan tetapi tidak dapat memulai satu.
Tautan: .NET 4 Framework Framework
Menurut saya, fakta yang CancellationToken
hanya bisa mengamati negara dan tidak mengubahnya, sangat kritis. Anda dapat membagikan token seperti permen dan tidak pernah khawatir bahwa orang lain, selain Anda, akan membatalkannya. Ini melindungi Anda dari kode pihak ketiga yang bermusuhan. Ya, peluangnya tipis, tapi saya pribadi suka jaminan itu.
Saya juga merasa bahwa itu membuat API lebih bersih dan menghindari kesalahan tak disengaja dan mempromosikan desain komponen yang lebih baik.
Mari kita lihat API publik untuk kedua kelas ini.
Jika Anda menggabungkannya, saat menulis LongRunningFunction, saya akan melihat metode seperti beberapa overload 'Batalkan' yang seharusnya tidak saya gunakan. Secara pribadi, saya benci melihat metode Buang juga.
Saya pikir desain kelas saat ini mengikuti filosofi 'lubang keberhasilan', itu memandu pengembang untuk membuat komponen yang lebih baik yang dapat menangani Task
pembatalan dan kemudian menyatukan mereka dalam berbagai cara untuk membuat alur kerja yang rumit.
Izinkan saya mengajukan pertanyaan, apakah Anda bertanya-tanya apa tujuan token? Itu tidak masuk akal bagi saya. Dan kemudian saya membaca Pembatalan di Thread yang Dikelola dan semuanya menjadi sangat jelas.
Saya percaya bahwa Desain Kerangka Pembatalan di TPL benar-benar kedudukan tertinggi.