Saya mungkin kehilangan sesuatu
Kamu adalah.
apa perbedaan antara melakukan Task.Wait
dan await task
?
Anda memesan makan siang dari pelayan di restoran. Sesaat setelah memberikan pesanan Anda, seorang teman berjalan masuk dan duduk di sebelah Anda dan memulai percakapan. Sekarang kamu punya dua pilihan. Anda dapat mengabaikan teman Anda sampai tugas selesai - Anda dapat menunggu sampai sup Anda tiba dan tidak melakukan apa pun saat Anda menunggu. Atau Anda dapat menanggapi teman Anda, dan ketika teman Anda berhenti berbicara, pelayan akan membawakan Anda sup.
Task.Wait
blok sampai tugas selesai - Anda mengabaikan teman Anda sampai tugas selesai. await
terus memproses pesan dalam antrian pesan, dan ketika tugas selesai, ia meminta pesan yang mengatakan "ambil tempat Anda tinggalkan setelah itu menunggu". Anda berbicara dengan teman Anda, dan ketika ada jeda dalam percakapan sup tiba.
Task
10 ms akan benar-benar mengeksekusi 10 jamTask
di utas Anda, sehingga menghalangi Anda selama 10 jam penuh?Untuk menunjukkan jawaban Eric di sini ada beberapa kode:
sumber
//If you press Button2 now you won't see anything in the console until this task is complete and then the label will be updated!
" itu menyesatkan. Setelah menekan tombol dengan tombolt.Wait();
pada event handler klikButtonClick()
, tidak mungkin untuk menekan apa pun dan kemudian melihat sesuatu di konsol dan memperbarui label "sampai tugas ini selesai" karena GUI dibekukan dan tidak responsif, yaitu klik atau interaksi dengan GUI sedang HILANG sampai selesainya tugas menunggut.Wait
akan memblokir di utas utama sampai tugas selesai."Contoh ini menunjukkan perbedaannya dengan sangat jelas. Dengan async / menunggu utas panggilan tidak akan memblokir dan melanjutkan eksekusi.
Output DoAsTask:
Output DoAsAsync:
Pembaruan: Contoh yang ditingkatkan dengan menampilkan ID utas di output.
sumber
Tunggu (), akan menyebabkan kode async berpotensi dijalankan secara sinkron. menunggu tidak akan.
Misalnya, Anda memiliki aplikasi web asp.net. Panggilan pengguna / getUser / 1 titik akhir. kumpulan aplikasi asp.net akan memilih utas dari utas (Thread1) dan, utas ini akan melakukan panggilan http. Jika Anda Tunggu (), utas ini akan diblokir sampai panggilan http diselesaikan. Saat sedang menunggu, jika UserB memanggil / getUser / 2, maka, kumpulan aplikasi perlu melayani utas lainnya (Thread2) untuk membuat panggilan http lagi. Anda baru saja membuat (Sebenarnya, diambil dari kumpulan aplikasi) utas lainnya tanpa alasan, karena Anda tidak dapat menggunakan Thread1 karena diblokir oleh Tunggu ().
Jika Anda menggunakan menunggu di Thread1, maka, SyncContext akan mengelola sinkronisasi antara panggilan Thread1 dan http. Cukup, ini akan memberi tahu setelah panggilan http selesai. Sementara itu, jika UserB melakukan panggilan / getUser / 2, maka, Anda akan menggunakan Thread1 lagi untuk melakukan panggilan http, karena itu dirilis setelah menunggu ditabrak. Kemudian permintaan lain dapat menggunakannya, bahkan lebih jauh lagi. Setelah panggilan http selesai (user1 atau user2), Thread1 bisa mendapatkan hasilnya dan kembali ke pemanggil (klien). Thread1 digunakan untuk banyak tugas.
sumber
Dalam contoh ini, tidak banyak, praktis. Jika Anda sedang menunggu tugas yang kembali pada utas yang berbeda (seperti panggilan WCF) atau melepaskan kontrol ke sistem operasi (seperti File IO), menunggu akan menggunakan lebih sedikit sumber daya sistem dengan tidak memblokir utas.
sumber
Pada contoh di atas, Anda dapat menggunakan "TaskCreationOptions.HideScheduler", dan sangat memodifikasi metode "DoAsTask". Metode itu sendiri tidak asinkron, seperti yang terjadi dengan "DoAsAsync" karena mengembalikan nilai "Tugas" dan ditandai sebagai "async", membuat beberapa kombinasi, ini adalah bagaimana ia memberi saya persis sama dengan menggunakan "async / menunggu" :
sumber