Saya tahu umumnya dianggap ide yang buruk untuk menggunakan async void
metode api-dan-lupakan untuk memulai tugas, karena tidak ada jejak tugas yang tertunda dan sulit untuk menangani pengecualian yang mungkin dilemparkan ke dalam metode seperti itu.
Haruskah saya juga menghindari async void
penanganan acara secara umum ? Sebagai contoh,
private async void Form_Load(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Saya bisa menulis ulang seperti ini:
Task onFormLoadTask = null; // track the task, can implement cancellation
private void Form_Load(object sender, System.EventArgs e)
{
this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
}
private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Apa saja batuan bawah air untuk penangan acara asinkron, selain kemungkinan masuk kembali?
Jawaban:
Pedomannya adalah untuk menghindari
async void
kecuali saat digunakan dalam penanganan peristiwa, jadi menggunakanasync void
dalam penanganan peristiwa tidak masalah.Yang mengatakan, untuk alasan pengujian unit saya sering suka memfaktorkan logika dari semua
async void
metode. Misalnya,sumber
Form_Load
akses sajapublic
? Sepertinya kode tersebut akan kurang bertele-tele seperti itu.OnFormLoadAsync
. Saya melihat sekarang bahwa ini membuat trik yang berguna. Terima kasih.Handled
Bendera harus disetel secara sinkron; tidak mungkin digunakanasync
untuk membuat keputusan tentang apakah acara tersebut ditangani atau tidak.ICommand.Execute
metodeasync void
; Saya menganggap ini diterima karenaICommand.Execute
merupakan logis event handler.Umumnya penangan acara adalah satu kasus di mana metode async void bukan bau kode potensial.
Sekarang, jika Anda memang perlu melacak tugas karena suatu alasan, maka teknik yang Anda gambarkan sangat masuk akal.
sumber
Ya, umumnya hanya kasus async void dari event handler. Jika Anda ingin tahu lebih banyak tentang itu, Anda dapat melihat video hebat di sini di saluran 9
The only case where this kind of fire-and-forget is appropriate is in top-level event-handlers. Every other async method in your code should return "async Task".
ini tautannya
sumber
Jika Anda menggunakan ReSharper, ReCommended Extension gratis dapat membantu Anda. Ini menganalisis metode "async void" dan menyoroti bila digunakan secara tidak tepat. Ekstensi dapat membedakan penggunaan async void yang berbeda dan menyediakan perbaikan cepat yang sesuai yang dijelaskan di sini: Wiki Ekstensi-yang Direkomendasikan .
sumber