Apa konvensi untuk nama metode sufiks dengan "Async"?
Haruskah sufiks "Async" ditambahkan hanya ke metode yang dideklarasikan dengan async
pengubah?
public async Task<bool> ConnectAsync()
Atau apakah cukup metode ini kembali Task<T>
atau Task
?
public Task<bool> ConnectAsync()
c#
.net
async-await
naming-conventions
naming
kasperhj
sumber
sumber
Jawaban:
Saya pikir kebenarannya ambigu bahkan dari dokumentasi Microsoft:
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
Itu belum benar. Metode apa pun dengan
async
asinkron dan kemudian mengatakannya harus mengembalikan aTask
atauTask<T>
- yang tidak tepat untuk metode di bagian atas tumpukan panggilan, Button_Click misalnya, atauasync void
.Tentu, Anda harus mempertimbangkan apa gunanya kebaktian itu?
Anda dapat mengatakan bahwa
Async
konvensi sufiks adalah untuk menyampaikan kepada pengguna API bahwa metode tersebut dapat menunggu. Agar metode dapat menunggu, ia harus mengembalikanTask
untuk void, atauTask<T>
untuk metode pengembalian nilai, yang berarti hanya yang terakhir yang dapat di-sufiksAsync
.Atau Anda mungkin mengatakan bahwa file
Async
konvensi sufiks adalah untuk mengomunikasikan bahwa metode dapat segera kembali, melepaskan utas saat ini untuk melakukan pekerjaan lain dan berpotensi menyebabkan balapan.Kutipan dokumen Microsoft ini mengatakan:
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Yang bahkan tidak menyebutkan bahwa metode asynchronous Anda sendiri yang kembali
Task
membutuhkanAsync
sufiks, yang menurut saya kita semua setuju.Jadi jawaban atas pertanyaan ini bisa jadi: keduanya. Dalam kedua kasus, Anda perlu menambahkan
Async
metode denganasync
kata kunci dan pengembalianTask
atauTask<T>
.Saya akan meminta Stephen Toub untuk mengklarifikasi situasinya.
Memperbarui
Jadi saya lakukan. Dan inilah yang ditulis orang baik kita:
Panduan singkat dari kalimat pembuka Stephen cukup jelas. Ini mengecualikan
async void
karena tidak biasa ingin membuat API publik dengan desain seperti itu karena cara yang benar untuk mengimplementasikan void asinkron adalah dengan mengembalikanTask
instance biasa dan membiarkan compiler melakukan sihirnya. Namun, jika Anda memang menginginkanpublic async void
, makaAsync
disarankan untuk menambahkan .async void
Metode top-of-stack lainnya seperti event handler biasanya tidak bersifat publik dan tidak penting / memenuhi syarat.Bagi saya, ini memberi tahu saya bahwa jika saya bertanya-tanya tentang sufiks
Async
pada anasync void
, saya mungkin harus mengubahnya menjadi anasync Task
sehingga penelepon dapat menunggunya, lalu tambahkanAsync
.sumber
PersonString
atauPriceDecimal
mengapa menggunakanGetAsync
- konsumen API dari async API tidak perlu khawatir tentang ini karena permintaan selalu kembali setelah semua tugas selesai. Itu konyol dan sangat mengganggu saya. Tapi itu hanyalah konvensi lain yang tidak ada yang benar-benar tahu mengapa itu ada di sana.Saya membangun banyak layanan API dan aplikasi lain yang memanggil sistem lain di mana sebagian besar kode saya berjalan asinkron.
Aturan praktis saya sendiri yang saya ikuti adalah:
Contoh:
Hanya satu metode:
Metode yang sama dengan dua tanda tangan:
Ini masuk akal karena ini adalah data yang sama yang dikembalikan tetapi satu-satunya hal yang berbeda adalah cara mengembalikan data , bukan datanya sendiri.
Saya juga berpikir konvensi penamaan ini ada karena kebutuhan untuk memperkenalkan metode asinkron dan tetap mempertahankan kompatibilitas ke belakang.
Saya berpendapat bahwa kode baru tidak boleh menggunakan sufiks Async. Ini sama jelasnya dengan tipe kembalian dari String, atau Int seperti yang disebutkan sebelumnya di utas ini.
sumber
The Pola Asynchronous berbasis Tugas (TAP) perintah bahwa metode harus selalu mengembalikan
Task<T>
(atauTask
) dan diberi nama dengan async akhiran; ini terpisah dari penggunaanasync
. KeduanyaTask<bool> Connect()
dan akan mengkompilasi dan berjalan dengan baik, tetapi Anda tidak akan mengikuti konvensi penamaan TAP.async
Task<bool> Connect()
Jika tubuh metode (terlepas dari jenis atau nama yang dikembalikan) termasuk
await
, Anda harus menggunakanasync
; dan kompilator akan memberi tahu Anda "Operator 'await' hanya dapat digunakan di dalam metode async. ...". KembaliTask<T>
atauTask
tidak "cukup" untuk menghindari penggunaanasync
. Lihat async (C # Reference) untuk detailnya.Kedua dan benar mengikuti konvensi TAP. Anda selalu dapat menggunakan kata kunci, tetapi Anda akan mendapatkan peringatan compiler "Metode async ini tidak memiliki operator 'await' dan akan berjalan secara sinkron. ..." jika body tidak digunakan .
async
Task<bool> ConnectAsync()
Task<bool> ConnectAsync()
async
await
sumber
async
kata kunci.async
adalah bagian kedua dari pertanyaan.async
pengubah atau tidak . Lihat juga contoh OP,public async Task<bool> ConnectAsync()
(denganasync
pengubah) vspublic Task<bool> ConnectAsync()
(tanpaasync
pengubah). Metode nama itu sendiri memiliki akhiran "async" dalam kedua kasus.Task
atau metode yang dimilikiasync Task
.Bahwa. Kata
async
kunci bukanlah masalah sebenarnya di sini. Jika Anda mengimplementasikan asynchrony tanpa menggunakanasync
kata kunci, metodenya masih "Async", dalam pengertian umum.sumber
Karena
Task
danTask<T>
keduanya merupakan tipe yang bisa ditunggu, mereka mewakili beberapa operasi asinkron. Atau setidaknya mereka harus mewakili.Anda harus menambahkan sufiks
Async
ke metode yang, dalam beberapa kasus (tidak harus semua), tidak mengembalikan nilai melainkan mengembalikan pembungkus di sekitar operasi yang sedang berlangsung. Pembungkus itu biasanya aTask
, tetapi pada Windows RT bisaIAsyncInfo
. Ikuti firasat Anda dan ingat bahwa jika pengguna kode Anda melihatAsync
fungsinya, dia akan tahu bahwa pemanggilan metode itu dipisahkan dari hasil metode itu dan mereka perlu bertindak sesuai dengan itu.Perhatikan bahwa ada metode seperti
Task.Delay
danTask.WhenAll
yang mengembalikanTask
namun tidak memilikiAsync
sufiks.Perhatikan juga bahwa ada
async void
metode yang mewakili api dan lupakan metode asinkron dan Anda harus lebih berhati-hati bahwa metode tersebut dibangun dengan cara seperti itu.sumber
Saya berpendapat bahwa itu harus menggunakan Async-suffix jika mengembalikan Tugas terlepas dari apakah metode tersebut dideklarasikan dengan
async
pengubah atau tidak.Alasan di baliknya adalah bahwa nama tersebut dideklarasikan di antarmuka. Antarmuka mendeklarasikan tipe kembalian yaitu a
Task
. Kemudian ada dua implementasi dari antarmuka itu, satu implementasi mengimplementasikannya menggunakanasync
pengubah, yang lainnya tidak.sumber
Dalam Pemrograman Asinkron dengan async dan menunggu (C #) , Microsoft menawarkan panduan berikut:
Saya menemukan panduan ini tidak lengkap dan tidak memuaskan. Apakah ini berarti bahwa jika
async
pengubah tidak ada, metode ini harus dinamai,Connect
bukanConnectAsync
?Saya kira tidak. Seperti yang ditunjukkan dalam jawaban singkat oleh @Servy dan jawaban yang lebih rinci oleh @Luke Puplett , saya percaya bahwa itu tepat dan memang diharapkan metode ini harus dinamai
ConnectAsync
(karena mengembalikan sebuah menunggu). Untuk mendukung lebih lanjut hal ini, @John Skeet dalam jawaban untuk pertanyaan lain ini ditambahkanAsync
ke nama metode terlepas dari keberadaanasync
pengubah.Terakhir, untuk pertanyaan lain , pertimbangkan komentar ini oleh @Damien_The_Unbeliever :
Dari situ, saya menyimpulkan bahwa sifat asinkron dari metode yang menentukan bagaimana harus dinamai. Pengguna metode ini bahkan tidak akan tahu apakah
async
pengubah digunakan dalam implementasinya (tanpa kode sumber C # atau CIL).sumber