Dalam .Net 4.5 Microsoft telah menambahkan Async/Await
fitur baru untuk menyederhanakan pengkodean asinkron. Namun, saya heran
- Dapat
Async/Await
sepenuhnya menggantikan cara lama menggunakanThreads
? - Apakah
Async/Await
mampu melakukan apa pun yangThread
dapat dilakukan secara asinkron? - Dapat
Async/Await
hanya dapat digunakan dengan beberapa metode sepertiWebClient.DownloadStringAsync
atau bisa saya mengkonversi metode sinkron untuk membuatnya menggunakanAsync/Await
dan tidak untuk memblokir thread utama?
new Thread(() => {Some Work}).Start();
sama dengan melakukan?! bukan?Jawaban:
Tidak. Sebuah utas dapat melakukan lebih banyak hal berguna. Await dirancang khusus untuk menangani sesuatu yang memakan waktu, biasanya permintaan I / O. Yang secara tradisional dilakukan dengan callback ketika permintaan I / O selesai. Menulis kode yang mengandalkan callback ini cukup sulit, menunggu sangat menyederhanakannya.
Kurang lebih. Await hanya menangani menangani penundaan, itu tidak melakukan apa pun yang dilakukan utas. Ekspresi await , apa yang ada di sebelah kanan kata kunci await, adalah apa yang menyelesaikan pekerjaan. Idealnya itu tidak menggunakan utas sama sekali, itu memposting permintaan driver dan setelah driver menyelesaikan transfer data itu menghasilkan panggilan balik pemberitahuan penyelesaian. Jaringan sejauh ini merupakan penggunaan yang paling umum, latensi ratusan milidetik adalah umum dan efek samping yang tak terhindarkan dari layanan yang berpindah dari desktop atau LAN ke "cloud". Menggunakan layanan seperti itu secara sinkron akan membuat UI menjadi tidak responsif.
Tidak. Anda dapat menggunakannya dengan metode apa pun yang mengembalikan Tugas. Metode XxxxAsync () hanyalah yang telah dibuat sebelumnya dalam kerangka .NET untuk operasi umum yang membutuhkan waktu. Seperti mengunduh data dari server web.
sumber
async
tidak sesuai.await Task.Run
untuk pekerjaan yang terikat cpu. Jika saya mengerti dengan benar, itu terkadang menyelesaikan apa yang seharusnya dilakukan oleh seseorang jika tidak membuat thread, atau pekerja latar belakang, untuk dilakukan.Pernyataan resmi tentang ini. Meskipun Anda harus memahami perbedaan antara utas dan pemrograman asynchronous sebelum secara membabi buta mengganti satu hal dengan yang lain.
sumber
await Task.Run
. Ada penyebutan singkat tentang Task.Run, tetapi tidak jelas. Intinya adalah bahwaawait
dengan sendirinya tidak akan membuat tugas terikat cpu berjalan secara paralel, oleh karena itu pekerjaan seperti itu harus dilakukan melaluiawait Task.Run
.Saya memikirkannya seperti ini (dan menurut saya Microsoft juga melakukannya jika Anda melihat https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110 ) # benang )
Async / await adalah cara cepat untuk menjalankan beberapa kode pada thread aplikasi utama dengan keuntungan bahwa kode tersebut dapat menangguhkan dirinya sendiri saat tidak ada pekerjaan yang harus dilakukan dan mengembalikan fokus ke thread utama, "bangun" di thread utama saat ada adalah hasil yang akan diperoleh dan kemudian meneruskan pemrosesan kembali ke - Anda dapat menebaknya - utas utama. Anggap saja seperti pernyataan GOTO berbasis peristiwa di Basic yang dapat meneruskan kontrol bolak-balik ke jalur eksekusi tertentu.
Sebaliknya, thread adalah aliran eksekusi terpisah yang dapat dijalankan dengan variabelnya sendiri, dll. Di mana - dengan perangkat keras yang memadai - eksekusi terjadi secara paralel dengan thread utama.
Jika Anda memiliki aplikasi GUI yang akan mengunduh satu file dan kemudian melakukan sesuatu dengan file itu saat diunduh - saya akan menerapkannya menggunakan metode async / await.
Namun jika GUI Anda perlu mengunduh 5000 file - Saya akan membuat utas unduhan file untuk menanganinya karena utas GUI utama mungkin membeku saat eksekusi ditransfer untuk menangani pengunduhan file.
sumber