Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kaedah Tugas Async Void dan Async Berbeza dalam Mengendalikan Operasi Cemerlang dalam ASP.NET?

Bagaimanakah Kaedah Tugas Async Void dan Async Berbeza dalam Mengendalikan Operasi Cemerlang dalam ASP.NET?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-04 01:43:41822semak imbas

How Do Async Void and Async Task Methods Differ in Handling Outstanding Operations in ASP.NET?

Kiraan Operasi Cemerlang dalam Async Void dan Async Task dalam ASP.Net

Dalam aplikasi ASP.Net, kaedah async void berbeza daripada kaedah Tugas async dalam pengendalian operasi tertunggak. Perbezaan ini boleh membawa kepada pengecualian berikut dengan async void tetapi tidak dengan async Task:

System.InvalidOperationException: An asynchronous module or handler completed while an asynchronous operation was still pending

Memahami Async Void

Async void menambah kiraan operasi tertunggak apabila dipanggil dan mengurangkannya apabila selesai. Ini menunjukkan bahawa ia tidak benar-benar mengakibatkan gelagat "api dan lupa", kerana ASP.Net menjejaki penyiapannya.

Mengapa Tugas Async berfungsi?

Bila mengembalikan Tugas, kiraan operasi tertunggak tidak meningkat. Sebaliknya, rangka kerja mengendalikan menunggu secara tidak segerak untuk Tugasan yang dikembalikan selesai. Pendekatan ini menghapuskan potensi pengecualian yang disebutkan di atas.

Contoh

public class HomeController : AsyncController
{
    // Will work fine (no exception)
    public async Task<ActionResult> ThisPageWillLoad()
    {
        // Fire and forget task
        this.FireAndForgetTask();

        return await Task.FromResult(this.View("Index"));
    }

    private async Task FireAndForgetTask()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }

    // Will result in an exception due to async void
    public async Task<ActionResult> ThisPageWillNotLoad()
    {
        this.FireAndForgetVoid();

        return await Task.FromResult(this.View("Index"));
    }

    private async void FireAndForgetVoid()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }
}

Konteks Sejarah

Microsoft diutamakan ke belakang keserasian dan "satu ASP.NET" apabila memperkenalkan async kepada ASP.Net. Mereka mengekalkan sokongan untuk komponen EAP tetapi mempertingkatkan teras ASP.Net SynchronizationContext untuk mengesan dan mengecualikan sebarang penggunaan tidak wajar async void dalam senario tertentu. Dalam dunia MVC/WebAPI/SignalR, rangka kerja menggunakan Tugas async secara semula jadi, menghapuskan keperluan untuk kekosongan async.

Kesimpulan

Dalam aplikasi ASP.Net moden, ia biasanya disyorkan untuk mengelakkan async void dan sebaliknya mengembalikan Tugas. Pendekatan ini memastikan penjejakan yang betul bagi operasi tertunggak dan menghapuskan potensi pengecualian yang disebutkan di atas.

Atas ialah kandungan terperinci Bagaimanakah Kaedah Tugas Async Void dan Async Berbeza dalam Mengendalikan Operasi Cemerlang dalam ASP.NET?. 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