← Back to list

Fire and Forget

Fire and Forget, bir işlemi başlatıp sonucunu beklemeden devam etmektir. Bu işi başlatıyorum, bitti mi / hata oldu mu umurumda değil.

Ahmet Yaman · 2025-12-16 14:14 · 0 claps · 1.0 min read
#fireandforget #backend #c-sharp-programming #clean-code
Open on Medium ↗
Wiki topics: 💻 · Programming 🌐 · Web Development

Fire and Forget

Fire and Forget, bir işlemi başlatıp sonucunu beklemeden devam etmektir. Bu işi başlatıyorum, bitti mi / hata oldu mu umurumda değil.

  • Log atma
  • Email gönderme
  • Audit / telemetry
  • Background notification
  • Event publish (RabbitMQ, Kafka vb.)
public void CreateOrder()
{
    SendEmail(); // fire and forget gibi davranıyor
}

SendEmail ile pekiştirelim.

Hatalı Kullanım

public async void SendEmail()
{
    await smtp.SendAsync(); //HATALI
}

void dönüyor → kimse bu işi takip edemiyor

Bu metod bitti mi? → bilmiyorsun

Hata oldu mu? → bilmiyorsun

Bekleyebilir misin? (await) → hayır

✅Doğru kullanalım;

public async Task SendEmailAsync()
{
    await smtp.SendAsync();//Metot mutlaka Task dönmeli
}
_ = Task.Run(async () =>
{
    try
    {
        await SendEmailAsync();
    }
    catch (Exception ex)
    {
        logger.LogError(ex, "Email gönderilemedi");
    }
});

Task.Run(…) Ne yaptık?

İşi arka planda başlattık

Email gönderme işi ana akışı bloklamasın diye

Thread pool’dan bir thread aldı

**async () => { ... } — Email gönderme asenkron**

SAFE Fire & Forget

public void CreateOrder()
{
    _ = Task.Run(async () =>
    {
        try
        {
            await SendEmailAsync();
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "Email gönderilemedi");
        }
    });
}

CreateOrder hemen devam eder.Email beklenmez.

Örnek Kullanım

BackgroundService / IHostedService

public class EmailBackgroundService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // Queue'dan iş al
            await Task.Delay(1000);
        }
    }
}

Controller:

public IActionResult CreateOrder()
{
    emailQueue.Enqueue(orderId);
    return Ok();
}


메타데이터
post_id
9e4e2a4dbf57
slug
fire-and-forget-9e4e2a4dbf57
url
https://medium.com/@yaman2222/fire-and-forget-9e4e2a4dbf57
canonical_url
https://medium.com/@yaman2222/fire-and-forget-9e4e2a4dbf57
author_url
https://medium.com/@yaman2222
status
ok
fetched_at
2026-06-22 17:31:34