Saya pikir kebenarannya ambigu bahkan dari dokumentasi Microsoft:
Dalam Visual Studio 2012 dan .NET Framework 4.5, metode apa pun yang dikaitkan dengan async
kata kunci ( Async
dalam Visual Basic) dianggap sebagai metode asinkron, dan kompiler C # dan Visual Basic melakukan transformasi yang diperlukan untuk menerapkan metode secara asinkron dengan menggunakan TAP. Metode asynchronous harus mengembalikan sebuah Task
atau sebuah Task<TResult>
objek.
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 a Task
atau Task<T>
- yang tidak tepat untuk metode di bagian atas tumpukan panggilan, Button_Click misalnya, atau async 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 mengembalikan Task
untuk void, atau Task<T>
untuk metode pengembalian nilai, yang berarti hanya yang terakhir yang dapat di-sufiks Async
.
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:
Berdasarkan konvensi, Anda menambahkan "Asinkron" ke nama metode yang memiliki pengubah Asinkron atau asinkron.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Yang bahkan tidak menyebutkan bahwa metode asynchronous Anda sendiri yang kembali Task
membutuhkan Async
sufiks, yang menurut saya kita semua setuju.
Jadi jawaban atas pertanyaan ini bisa jadi: keduanya. Dalam kedua kasus, Anda perlu menambahkan Async
metode dengan async
kata kunci dan pengembalian Task
atau Task<T>
.
Saya akan meminta Stephen Toub untuk mengklarifikasi situasinya.
Memperbarui
Jadi saya lakukan. Dan inilah yang ditulis orang baik kita:
Jika metode publik adalah Pengembalian tugas dan bersifat asinkron (berbeda dengan metode yang diketahui selalu mengeksekusi secara sinkron hingga selesai tetapi masih mengembalikan Tugas karena beberapa alasan), metode tersebut harus memiliki akhiran "Asinkron". Itu pedomannya. Sasaran utama di sini dengan penamaan adalah untuk membuatnya sangat jelas bagi konsumen tentang fungsionalitas bahwa metode yang dipanggil kemungkinan besar tidak akan menyelesaikan semua pekerjaannya secara sinkron; ini tentu saja juga membantu dalam kasus di mana fungsionalitas diekspos dengan metode sinkron dan asinkron sehingga Anda memerlukan perbedaan nama untuk membedakannya. Bagaimana metode mencapai implementasi asynchronousnya tidak penting untuk penamaan: apakah async / await digunakan untuk mengumpulkan bantuan compiler, atau apakah jenis dan metode dari System.Threading.Tasks digunakan secara langsung (e. g. TaskCompletionSource) tidak terlalu penting, karena itu tidak mempengaruhi tanda tangan metode sejauh menyangkut konsumen metode.
Tentu saja, selalu ada pengecualian pada pedoman. Yang paling menonjol dalam kasus penamaan adalah kasus di mana alasan keseluruhan tipe adalah untuk menyediakan fungsionalitas yang berfokus pada asinkron, dalam hal ini memiliki Asinkron pada setiap metode akan berlebihan, misalnya metode pada Tugas itu sendiri yang menghasilkan Tugas lain .
Sedangkan untuk metode asynchronous void-return, tidak diinginkan untuk memiliki metode tersebut di area permukaan publik, karena pemanggil tidak memiliki cara yang baik untuk mengetahui kapan pekerjaan asinkron telah selesai. Jika Anda harus mengekspos metode asinkron yang kembali kosong secara publik, Anda mungkin ingin memiliki nama yang menyatakan bahwa pekerjaan asinkron sedang dimulai, dan Anda dapat menggunakan akhiran "Asinkron" di sini jika memungkinkan. Mengingat betapa jarangnya kasus ini, saya berpendapat ini benar-benar jenis keputusan kasus per kasus.
Saya harap itu membantu, Steve
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 mengembalikan Task
instance biasa dan membiarkan compiler melakukan sihirnya. Namun, jika Anda memang menginginkan public async void
, maka Async
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 an async void
, saya mungkin harus mengubahnya menjadi an async Task
sehingga penelepon dapat menunggunya, lalu tambahkan Async
.