Async/Await di .NET Bisa Boros Resource Kalau Tanpa Limit ๐Ÿš€๐Ÿ›‘

Published: (December 27, 2025 at 11:54 PM EST)
2 min read
Source: Dev.to

Source: Dev.to

Pendahuluan

Banyak dari kita berpikir bahwa menggunakan async/await secara otomatis membuat aplikasi kita โ€œskalabelโ€. Namun, tanpa mekanisme pembatasan (throttling), kode async justru dapat menjadi senjata makan tuan yang menghabiskan resource server dalam sekejap. Pada artikel ini (dan video YouTube terbaru saya), kita akan membahas mengapa Task.WhenAll tanpa limit berbahaya dan bagaimana SemaphoreSlim dapat menyelamatkan server Anda.

Apa yang Terjadi di Balik Layar?

  • Socket Exhaustion โ€“ Server kehabisan port untuk koneksi keluar.
  • Database Pool Starvation โ€“ Request lain tertahan karena semua koneksi DB sedang dipakai.
  • RAM Spike โ€“ Setiap task membawa state machine dan alokasi memori sendiriโ€‘sendiri.

Akibatnya, server โ€œhangโ€, request timeout, dan pengguna menjadi kecewa.

SemaphoreSlim

SemaphoreSlim adalah cara paling ringan di .NET untuk membatasi berapa banyak task yang boleh berjalan secara konkuren.

Cara Implementasi yang Benar

// Batasi maksimal 10 operasi konkuren
using var semaphore = new SemaphoreSlim(10);

var tasks = dataList.Select(async d =>
{
    await semaphore.WaitAsync(); // Antre di sini
    try
    {
        await CallExternalApiAsync(d);
    }
    finally
    {
        semaphore.Release(); // Lepas slot untuk task berikutnya
    }
});

await Task.WhenAll(tasks);

Dengan kode ini, meskipun Anda memiliki 1.000 data, hanya 10 data yang diproses secara bersamaan. Resource server tetap terjaga, dan aplikasi tetap responsif.

Praktik Terbaik

  • Gunakan try...finally: Selalu panggil Release() di blok finally. Jika tidak, slot semaphore akan โ€œbocorโ€ dan aplikasi dapat mengalami deadlock.
  • Tentukan Limit yang Rasional: Jangan asal memasang angka. Sesuaikan limit dengan kemampuan resource (misalnya: jumlah koneksi maksimal di Database Pool Anda).
  • Semaphore vs Lock: Hindari penggunaan lock biasa untuk kode async. lock memblokir thread, sedangkan WaitAsync() membebaskan thread untuk mengerjakan hal lain sambil menunggu antrean.

Kesimpulan

async/await memberikan kita kekuatan, tetapi SemaphoreSlim memberikan kita kendali. Jangan biarkan server Anda tumbang hanya karena mencoba melakukan terlalu banyak hal pada waktu yang sama. Batasi concurrency dengan bijak, dan aplikasi Anda akan tetap responsif serta stabil.

Back to Blog

Related posts

Read more ยป