0Pricing
C# Academy · Ders

Zaman aşimleri, IProgress<T> ve async kaynak temizleme (öykünme)

CancelAfter veya Task.WhenAny tabanlı zaman aşimleri uygulayın, kullanıcı arayüzüne uygun güncellemeler için IProgress bağlayın ve C# 6'da async temizlemeyi öykünmek üzere try/finally kullanın.

Zaman aşimleri, IProgress<T> ve async kaynak temizleme (öykünme), CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.

Plan

Amaç:

  • CancelAfter ile zaman aşımı
  • Task.WhenAny aracılığıyla zaman aşımı
  • IProgress<T> ile ilerleme bildirimi
  • C# 6'da async temizleme düzeni (try/finally)

CancelAfter ile zaman aşımı

CancelAfter kullanın ve belirteci async API'ye iletin; çağrılan yöntem zaman aşımında işbirlikli olarak durur.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task<string> SlowOpAsync(CancellationToken ct)
  {
    // Simulate slow I/O that honors cancellation
    await Task.Delay(500, ct);
    return "OK";
  }

  public static void Main(string[] args)
  {
    var cts = new CancellationTokenSource();
    cts.CancelAfter(150); // timeout after 150 ms

    Task<string> t = SlowOpAsync(cts.Token);
    try
    {
      string result = t.GetAwaiter().GetResult(); // demo only
      Console.WriteLine(result);
    }
    catch (OperationCanceledException)
    {
      Console.WriteLine("Timed out");
    }
  }
}

WhenAny aracılığıyla zaman aşımı

Task.WhenAny, işi Task.Delay ile yarıştırır; gecikme kazanırsa bir TimeoutException fırlatın.

using System;
using System.Threading.Tasks;

public class Program
{
  // Wrap any Task<T> with a timeout using WhenAny
  static async Task<T> WithTimeoutAsync<T>(Task<T> work, int milliseconds)
  {
    Task delay = Task.Delay(milliseconds);
    Task first = await Task.WhenAny(work, delay);
    if (first == work) return await work; // completed in time
    throw new TimeoutException("Operation timed out");
  }

  static async Task<int> ComputeAsync()
  {
    await Task.Delay(300); // pretend work
    return 7;
  }

  public static void Main(string[] args)
  {
    try
    {
      int v = WithTimeoutAsync(ComputeAsync(), 100).GetAwaiter().GetResult();
      Console.WriteLine("Value " + v);
    }
    catch (TimeoutException ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

IProgress<T> gösterimi

IProgress<T>, işi kullanıcı arayüzünden ayırır; üreticiler Report çağırır, tüketiciler kullanıcı arayüzünü veya iş parçacığını güvenli biçimde günceller.

using System;
using System.Threading.Tasks;

public class Program
{
  static async Task DownloadAsync(IProgress<int> progress)
  {
    // Report 0..100 in steps; UI would receive ProgressChanged on its context
    for (int p = 0; p <= 100; p += 25)
    {
      await Task.Delay(60);
      if (progress != null) progress.Report(p);
    }
  }

  public static void Main(string[] args)
  {
    Progress<int> prog = new Progress<int>(percent =>
    {
      Console.WriteLine("Progress: " + percent + "%");
    });

    DownloadAsync(prog).GetAwaiter().GetResult();
  }
}

Async temizleme düzeni

C# 6'da IAsyncDisposable yoktur; try/finally kullanın ve await edilen iş tamamlandıktan sonra finally içinde kaynakları serbest bırakın.

using System;
using System.IO;
using System.Threading.Tasks;

public class Program
{
  static async Task WriteThenCloseAsync(string path)
  {
    // C# 6 has no IAsyncDisposable; emulate with try/finally.
    FileStream fs = null;
    StreamWriter sw = null;
    try
    {
      fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
      sw = new StreamWriter(fs);
      await sw.WriteAsync("hello"); // do async work
      await sw.FlushAsync();        // ensure data is flushed
    }
    finally
    {
      // Dispose synchronously in finally
      if (sw != null) sw.Dispose();
      else if (fs != null) fs.Dispose();
    }
  }

  public static void Main(string[] args)
  {
    WriteThenCloseAsync("out.txt").GetAwaiter().GetResult();
    Console.WriteLine("Written");
  }
}

En iyi uygulamalar

İpuçları:

  • Basit işlem zaman aşımları için CancelAfter kullanmayı tercih edin.
  • Özel zaman aşımı akışları için WhenAny kullanın.
  • İlerleme türlerini küçük tutun (ör. yüzdeyi belirten int veya basit bir yapı).
  • Kaynakları serbest bırakmadan önce await işlemlerini her zaman tamamlayın; serbest bırakma işlemini finally içine koyun.

Zaman aşımı düzeni

Hızlı kontrol: C# 6'da engelleme yapmadan bir async işleme zaman aşımı eklemenin basit bir yolu nedir?

Özet

Özet: Zaman aşımlarını CancelAfter veya WhenAny ile uygulayın, ilerlemeyi IProgress<T> aracılığıyla bildirin ve C# 6'da async kaynak bırakmayı try/finally ile taklit edin.

Sıkça Sorulan Sorular

“Zaman aşimleri, IProgress<T> ve async kaynak temizleme (öykünme)” dersi ücretsiz mi?

Evet — “Zaman aşimleri, IProgress<T> ve async kaynak temizleme (öykünme)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.

“Zaman aşimleri, IProgress<T> ve async kaynak temizleme (öykünme)” dersinde ne öğreneceğim?

CancelAfter veya Task.WhenAny tabanlı zaman aşimleri uygulayın, kullanıcı arayüzüne uygun güncellemeler için IProgress bağlayın ve C# 6'da async temizlemeyi öykünmek üzere try/finally kullanın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 2. dersidir.

“Zaman aşimleri, IProgress<T> ve async kaynak temizleme (öykünme)” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. CancellationToken kalıpları; iş birliğine dayalı iptal
  2. Zaman aşimleri, IProgress ve async kaynak temizleme (öykünme)
  3. Dayanıklılığın temelleri: yeniden deneme ve geri çekilme
← C# Academy Sayfasına Dön