Rumah >pembangunan bahagian belakang >C++ >Bila dan Mengapa Adakah `async void` merupakan Amalan Buruk dalam C#?

Bila dan Mengapa Adakah `async void` merupakan Amalan Buruk dalam C#?

Barbara Streisand
Barbara Streisandasal
2024-12-25 13:23:55655semak imbas

When and Why Is `async void` a Bad Practice in C#?

Bila dan Mengapa async void Dianggap sebagai Amalan Buruk?

Memahami Konteks:

Kaedah Async dalam C# boleh kembali sama ada Tugas atau batal. Walaupun kaedah async void boleh kelihatan mudah dalam senario tertentu, kaedah ini memperkenalkan potensi kelemahan yang menyebabkan mereka tidak digalakkan. Mari kita periksa mengapa async void dianggap sebagai amalan buruk dan cara mendekati situasi ini dengan lebih berkesan.

Sebab untuk Mengelak async void:

  1. Pengendalian Ralat Cabaran:
    Tidak seperti kaedah Tugas async, pengecualian melarikan diri daripada kaedah void async mempunyai semantik pengendalian ralat yang tidak konvensional, menjadikannya sukar untuk mengendalikannya dengan sewajarnya.
  2. Cabaran Mengarang:
    Kaedah void Async tidak boleh digubah dengan mudah ke dalam kaedah async peringkat lebih tinggi. Ini mengehadkan kebolehselenggaraan dan penggunaan semula kod.
  3. Kesukaran Pengujian:
    Kaedah async void ujian unit adalah jauh lebih kompleks daripada menguji kaedah Tugas async, disebabkan oleh pengendalian ralat dan semantik komposisi yang unik .

Alternatif Pendekatan:

Dalam contoh yang disediakan, di mana tumpuan terletak pada bertindak balas kepada klik butang tanpa menunggu hasilnya, pendekatan yang lebih sesuai adalah untuk mentakrifkan kaedah PrimeCustomTask sebagai Tugas async dan menggunakan kaedah OnLoad sebagai titik masuk untuk memulakan operasi tak segerak. Dengan cara ini, semua faedah kaedah Async Task dipelihara:

protected override async void OnLoad(EventArgs e)
{
    if (CustomTask == null)
        await PrimeCustomTask();
}

private async Task PrimeCustomTask()
{
    CustomTask = new TaskCompletionSource<int>();
    while (CustomTask.Task.IsCompleted == false && IsDisposed == false) 
    {
        // Wait for button click to set the value
        await Task.Delay(100); 
    }

    int result = CustomTask.Task.Result;

    // Show the value
    if (result != 0) MessageBox.Show(result.ToString());
}

Dengan mematuhi garis panduan ini, anda boleh mengelakkan perangkap kaedah async void dan meningkatkan kebolehselenggaraan, kebolehgunaan semula dan kebolehujian kod anda.

Atas ialah kandungan terperinci Bila dan Mengapa Adakah `async void` merupakan Amalan Buruk dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn