Oke, kedengarannya aneh, tetapi kodenya sangat sederhana dan menjelaskan situasinya dengan baik.
public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
AssertNotDisposed();
var roles = await GetRolesForUser(user);
roles.Roles = RemoveRoles(roles.Roles, role);
await Run(TableOperation.Replace(roles));
}
(Saya tahu saya berbicara semacam abstrak di bawah ini, tetapi di atas adalah metode aktual dari apa yang akan menjadi kode produksi aktual yang benar-benar melakukan apa yang saya tanyakan di sini, dan saya benar-benar tertarik pada Anda sebenarnya meninjau untuk kebenaran vis a vis pola async / wait.)
Saya menghadapi pola ini semakin sering sekarang saya menggunakan async
/ await
lebih. Polanya terdiri dari rantai peristiwa berikut:
- Menunggu panggilan awal yang memberi saya beberapa informasi yang perlu saya kerjakan
- Kerjakan informasi itu secara sinkron
- Menunggu panggilan terakhir yang menyimpan pekerjaan yang diperbarui
Blok kode di atas biasanya bagaimana saya menangani metode ini. Saya await
panggilan pertama, yang harus saya lakukan karena tidak sinkron. Selanjutnya, saya melakukan pekerjaan yang harus saya lakukan yang bukan IO atau sumber daya terikat, dan juga bukan async. Akhirnya, saya menyimpan pekerjaan saya yang juga merupakan async
panggilan, dan keluar dari kultus kargo saya await
itu.
Tetapi apakah ini cara yang paling efisien / benar untuk menangani pola ini? Sepertinya saya bisa melewatkan await
panggilan terakhir, tetapi bagaimana jika gagal? Dan haruskah saya menggunakan Task
metode seperti ContinueWith
untuk menghubungkan kerja sinkron saya dengan panggilan asli? Saya hanya pada satu titik saat ini di mana saya tidak yakin apakah saya menangani ini dengan benar.
Diberikan kode dalam contoh , apakah ada cara yang lebih baik untuk menangani rantai panggilan metode async / sync / async ini?