Async / Await vs Threads

100

Dalam .Net 4.5 Microsoft telah menambahkan Async/Awaitfitur baru untuk menyederhanakan pengkodean asinkron. Namun, saya heran

  1. Dapat Async/Awaitsepenuhnya menggantikan cara lama menggunakan Threads?
  2. Apakah Async/Awaitmampu melakukan apa pun yang Threaddapat dilakukan secara asinkron?
  3. Dapat Async/Awaithanya dapat digunakan dengan beberapa metode seperti WebClient.DownloadStringAsyncatau bisa saya mengkonversi metode sinkron untuk membuatnya menggunakan Async/Awaitdan tidak untuk memblokir thread utama?
Roman Ratskey
sumber
2
Utas dan Async / Await adalah fitur yang tidak terkait. Anda dapat menggabungkannya, tetapi tidak harus.
dtb
2
Saya pikir Async / Await melakukan hal yang new Thread(() => {Some Work}).Start();sama dengan melakukan?! bukan?
Roman Ratskey
2
Nggak. Asumsi Anda tidak benar. Anda mungkin berpikir tentang Task.Run (TPL), yang sering dikombinasikan dengan Async / Await, tetapi juga tidak terkait dan tidak harus digunakan dengannya.
dtb
4
@dtb: Jadi kapan menggunakan Async / Await dan kapan menggunakan Threads?. Saya benar-benar bingung tentang perbedaan antara Task.Run, Thread.Start, Async / Await. Jika Anda dapat memberi saya penjelasan yang baik yang membuat saya memahami perbedaan di antara mereka, saya akan sangat berterima kasih
Roman Ratskey
2
Async / await tidak membuat atau dengan cara lain menggunakan utas.
WRAR

Jawaban:

78

dapatkah itu sepenuhnya menggantikan cara lama menggunakan Threads?

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.

mampu melakukan apa pun yang dapat dilakukan Thread secara asinkron?

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.

hanya dapat digunakan dengan beberapa metode seperti WebClient.DownloadStringAsync

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.

Hans Passant
sumber
4
Dalam aspek C # modern, apa pendekatan terbaik untuk mencapai Async-Callbacks pada API eksternal?
bonCodigo
5
Tercakup di paragraf terakhir, gunakan Tugas.
Hans Passant
Saya mengharapkan sesuatu yang dapat dilakukan thread yang tidak dapat dilakukan melalui pemrograman async sebagai contoh.
Saeed Neamati
1
Bisakah Anda memperluas "Sebuah utas dapat melakukan lebih banyak hal berguna."? Akan berguna untuk memahami fitur yang disediakan thread yang asynctidak sesuai.
Benjohn
1
Layak disebutkan await Task.Rununtuk 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.
ToolmakerSteve
15

Pernyataan resmi tentang ini. Meskipun Anda harus memahami perbedaan antara utas dan pemrograman asynchronous sebelum secara membabi buta mengganti satu hal dengan yang lain.

wRAR
sumber
Ini seperti sumber daya pertama yang saya baca tentang Threads dan Async / Await yang jelas dan ringkas.
Arman Bimatov
2
Jawaban ini hanya berisi link ke dokumentasi. Karena tautannya mungkin sudah ketinggalan zaman, jawabannya mungkin sudah ketinggalan zaman - atau bahkan lebih buruk - sama sekali tidak berguna. Kami mendorong pengguna Stack untuk memposting bagian link yang relevan langsung ke pertanyaan mereka.
HimBromBeere
1
Sayangnya, pernyataan resmi tidak menjelaskan kapan harus melakukannya await Task.Run. Ada penyebutan singkat tentang Task.Run, tetapi tidak jelas. Intinya adalah bahwa awaitdengan sendirinya tidak akan membuat tugas terikat cpu berjalan secara paralel, oleh karena itu pekerjaan seperti itu harus dilakukan melalui await Task.Run.
ToolmakerSteve
1

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.

xflowXen
sumber