Untuk pembelajaran tercepat ..
Memahami aliran eksekusi metode (dengan diagram): 3 menit
Introspeksi pertanyaan (sake pembelajaran): 1 menit
Cepat melewati sintaks gula: 5 menit
Bagikan kebingungan pengembang: 5 menit
Masalah: Cepat ubah implementasi kode normal dunia nyata menjadi kode Async: 2 menit
Kemana Selanjutnya?
Memahami aliran eksekusi metode (dengan diagram): 3 menit
Dalam gambar ini, fokus saja pada # 6 (tidak lebih)
Pada langkah # 6: Eksekusi berhenti di sini karena kehabisan pekerjaan. Untuk melanjutkannya, dibutuhkan hasil dari getStringTask (semacam fungsi). Oleh karena itu, ia menggunakan await
operator untuk menunda progresnya dan memberikan kendali kembali (hasil) kepada penelepon (dari metode yang kita gunakan ini). Panggilan sebenarnya ke getStringTask dibuat lebih awal di # 2. Di # 2 janji dibuat untuk mengembalikan hasil string. Tetapi kapan akan mengembalikan hasilnya? Haruskah kita (# 1: AccessTheWebAsync) melakukan panggilan kedua lagi? Siapa yang mendapatkan hasilnya, # 2 (pernyataan panggilan) atau # 6 (menunggu pernyataan)
Penelepon eksternal AccessTheWebAsync () juga sedang menunggu sekarang. Jadi pemanggil menunggu AccessTheWebAsync, dan AccessTheWebAsync sedang menunggu GetStringAsync saat ini. Yang menarik adalah AccessTheWebAsync melakukan beberapa pekerjaan sebelum menunggu (# 4) mungkin untuk menghemat waktu dari menunggu. Kebebasan yang sama untuk multitask juga tersedia untuk penelepon eksternal (dan semua penelepon dalam rantai) dan ini adalah nilai tambah terbesar dari hal 'async' ini! Anda merasa itu sinkron..atau normal tetapi tidak.
Ingat, metode itu sudah dikembalikan (# 2), tidak bisa kembali lagi (tidak ada kedua kalinya). Jadi bagaimana penelepon tahu? Ini semua tentang Tugas! Tugas telah berlalu. Tugas menunggu (bukan metode, bukan nilai). Nilai akan ditetapkan dalam Tugas. Status tugas akan ditetapkan untuk selesai. Pemanggil hanya memonitor Tugas (# 6). Jadi 6 # adalah jawaban ke mana / siapa yang mendapatkan hasilnya. Bacaan selanjutnya untuk nanti di sini .
Introspeksi pertanyaan demi pembelajaran: 1 menit
Mari kita sesuaikan pertanyaannya sedikit:
Bagaimana dan Kapan menggunakan dan ? async
await
Tasks
Karena belajar Task
secara otomatis mencakup dua lainnya (dan menjawab pertanyaan Anda)
Cepat melewati sintaks gula: 5 menit
Sebelum konversi (metode asli)
internal static int Method(int arg0, int arg1)
{
int result = arg0 + arg1;
IO(); // Do some long running IO.
return result;
}
metode Task-ified untuk memanggil metode di atas
internal static Task<int> MethodTask(int arg0, int arg1)
{
Task<int> task = new Task<int>(() => Method(arg0, arg1));
task.Start(); // Hot task (started task) should always be returned.
return task;
}
Apakah kami menyebutkan menunggu atau async? Tidak. Hubungi metode di atas dan Anda mendapatkan tugas yang dapat Anda pantau. Anda sudah tahu tugas apa yang dikembalikan .. integer.
Memanggil Tugas sedikit rumit dan saat itulah kata kunci mulai muncul. Mari kita panggil MethodTask ()
internal static async Task<int> MethodAsync(int arg0, int arg1)
{
int result = await HelperMethods.MethodTask(arg0, arg1);
return result;
}
Kode yang sama di atas ditambahkan sebagai gambar di bawah ini:
- Kami sedang 'menunggu' tugas untuk diselesaikan. Karena itu
await
- Karena kita menggunakan menunggu, kita harus menggunakan
async
(sintaksis wajib)
- MethodAsync dengan
Async
sebagai awalan (standar pengkodean)
await
mudah dimengerti tetapi dua sisanya ( async
, Async
) mungkin tidak :). Yah, itu seharusnya lebih masuk akal untuk kompiler sekalipun. Selanjutnya dibaca nanti di sini
Jadi ada 2 bagian.
- Buat 'Tugas'
- Buat gula sintaksis untuk memanggil tugas (
await+async
)
Ingat, kami memiliki penelepon eksternal untuk AccessTheWebAsync () dan penelepon itu juga tidak luput ... artinya perlu await+async
juga sama . Dan rantai itu berlanjut. Tetapi akan selalu ada Task
satu ujung.
Semua baik-baik saja, tetapi satu pengembang terkejut melihat # 1 (Tugas) hilang ...
Bagikan kebingungan pengembang: 5 menit
Pengembang telah membuat kesalahan dengan tidak mengimplementasikan Task
tetapi masih berfungsi! Cobalah untuk memahami pertanyaan dan hanya jawaban yang diterima yang disediakan di sini . Semoga Anda telah membaca dan sepenuhnya dipahami. Ringkasannya adalah bahwa kita mungkin tidak melihat / mengimplementasikan 'Tugas' tetapi dilaksanakan di suatu tempat di kelas induk. Demikian juga dalam contoh kita memanggil yang sudah dibangun MethodAsync()
jauh lebih mudah daripada menerapkan metode itu dengan Task
( MethodTask()
) diri kita sendiri. Sebagian besar pengembang merasa kesulitan untuk Tasks
mengubah kode sambil mengonversi kode ke kode Asynchronous.
Kiat: Cobalah untuk menemukan implementasi Async yang ada (seperti MethodAsync
atau ToListAsync
) untuk melakukan outsourcing kesulitan. Jadi kita hanya perlu berurusan dengan Async dan menunggu (yang mudah dan sangat mirip dengan kode normal)
Masalah: Cepat ubah implementasi kode normal dunia nyata ke operasi Async: 2 menit
Baris kode yang ditunjukkan di bawah ini di Lapisan Data mulai rusak (banyak tempat). Karena kami memperbarui beberapa kode kami dari .Net framework 4.2. * Ke .Net core. Kami harus memperbaikinya dalam 1 jam di seluruh aplikasi!
var myContract = query.Where(c => c.ContractID == _contractID).First();
mudah!
- Kami menginstal paket nuget EntityFramework karena memiliki QueryableExtensions. Atau dengan kata lain itu melakukan implementasi Async (tugas), sehingga kita bisa bertahan dengan kode sederhana
Async
dan await
dalam.
- namespace = Microsoft.EntityFrameworkCore
saluran kode panggilan diubah seperti ini
var myContract = await query.Where(c => c.ContractID == _contractID).FirstAsync();
Metode tanda tangan berubah dari
Contract GetContract(int contractnumber)
untuk
async Task<Contract> GetContractAsync(int contractnumber)
Metode panggilan juga terpengaruh: GetContractAsync(123456);
dipanggil sebagaiGetContractAsync(123456).Result;
Kami mengubahnya di mana-mana dalam 30 menit!
Tetapi arsitek mengatakan kepada kami untuk tidak menggunakan perpustakaan EntityFramework hanya untuk ini! Ups! drama! Kemudian kami membuat implementasi Tugas kustom (yuk). Yang kamu tahu caranya. Masih mudah! .. masih yuk ..
Kemana Selanjutnya?
Ada video cepat yang luar biasa yang bisa kita tonton tentang Konversi Panggilan Sinkron ke Asinkron di ASP.Net Core , mungkin itu kemungkinan arah yang akan dituju setelah membaca ini.