ASP.NET Core 7, Microsoft’un açık kaynaklı web uygulaması geliştirme çerçevesinin en son sürümü olmasına rağmen, önceki .NET sürümlerinden sayısız önemli özellikten yararlanır. Bu önemli özelliklerden biri, çok iş parçacıklı uygulamaları zarif bir şekilde işlemenin bir yolunu sağlayan iptal belirteçleridir.
ASP.NET Core uygulamalarıyla çalışırken, uygulamanın kaynakları serbest bırakabilmesi ve duyarlı kalın. İptal belirteçlerinin devreye girdiği yer burasıdır.
Bu makalede, iptal belirteçleri, neden yararlı oldukları ve bunların ASP.NET Core’daki minimum API işleyicilerinde nasıl kullanılacağı anlatılmaktadır. Bu makalede verilen kod örnekleriyle çalışmak için sisteminizde Visual Studio 2022 Preview kurulu olmalıdır. Halihazırda bir kopyanız yoksa, Visual Studio 2022’yi buradan indirin.
Visual Studio 2022’de bir ASP.NET Core 7 minimal Web API projesi oluşturun
Öncelikle Visual Studio’da bir ASP.NET Core minimal API projesi oluşturalım. Bu adımların ardından Visual Studio 2022 Önizleme’de yeni bir ASP.NET Core 7 Web API projesi oluşturulacaktır:
- Visual Studio 2022 Önizleme IDE’sini başlatın.
- “Yeni proje oluştur” u tıklayın.
- “Yeni proje oluştur” penceresinde, görüntülenen şablonlar listesinden “ASP.NET Core Web API” seçeneğini seçin.
- Sonrakine tıkla.
- “Yeni projenizi yapılandırın” penceresinde yeni proje için isim ve konum belirleyin.
- İsteğe bağlı olarak, tercihlerinize bağlı olarak “Çözüm ve projeyi aynı dizine yerleştir” onay kutusunu işaretleyin.
- Sonrakine tıkla.
- Aşağıda gösterilen “Ek Bilgiler” penceresinde, bu örnekte minimum API kullanacağımız için “Denetleyicileri kullan…” yazan onay kutusunun işaretini kaldırın. “Kimlik Doğrulama Türü”nü “Yok” (varsayılan) olarak bırakın.
- Bu özelliklerin hiçbirini burada kullanmayacağımız için “Docker’ı Etkinleştir”, “HTTPS için Yapılandır” ve “Açık API Desteğini Etkinleştir” onay kutularının işaretli olmadığından emin olun.
- Oluştur’u tıklayın.
Minimal API uç noktaları oluşturmak ve iptal belirteçleriyle çalışmak için bu ASP.NET Core 7 Web API projesini kullanacağız.
İptal belirteçleri nedir? Onları ne zaman kullanmalıyız?
CancellationToken, CancellationTokenSource örneği tarafından oluşturulan hafif bir nesnedir. Bir CancellationTokenSource iptal edildiğinde, tüm CancellationTokens tüketicilerine buna göre bilgi verilir. Ek olarak, iptal belirteci örneğinin IsCancellationRequested özelliği true olarak ayarlanır ve bu, CancellationTokenSource’un iptal edildiğini ve görevin iptalinin istendiğini gösterir.
Kullanıcı web tarayıcısında bir isteği iptal ettiğinde uzun süredir devam eden bir işlemi durdurmak için CancellationToken kullanabilirsiniz. Başka bir deyişle, bir CancellationToken kullanmak, kullanıcı web sayfasını durdurduğunda veya yenilediğinde, uzun süredir devam eden isteklerin kaynakları kullanmasını durdurmanıza yardımcı olabilir.
Zaman uyumsuz görevleri durdurmak için CancellationTokens’ı da kullanabilirsiniz. Zaman uyumsuz bir görevde iptal, görevin mevcut etkinliğini gerçekleştirmeyi durdurması gerektiğini belirtir. Zaman uyumsuz bir görev, bir iptal belirteci alır ve bir iptal istenip istenmediğini görmek için onu inceler. Eğer öyleyse, mevcut operasyon derhal durdurulmalıdır.
ASP.NET Core’da uzun süre çalışan istekler
Web uygulamaları üzerinde çalışırken, veritabanı çağrıları, dosya işleme vb. gibi uzun süredir devam eden görevleri sıklıkla kullanabilirsiniz. Bir nesne bir veya daha fazla uzun süreli işlem oluşturduğunda, tüm bu işlemlere iptal belirteçleri iletmelidir. İptal belirteçleri diğer dahili işlemlere de iletilmelidir.
Sonunda, uzun süredir devam eden işlemleri oluşturan nesne – belirli bir süreye ulaşıldıktan sonra veya bir kullanıcı bir isteği durdurduğunda – bu iptal belirteçlerine bir iptal bildirimi yayabilir. Tüm uzun süreli operasyonların, kaynakların serbest bırakılabilmesi için iptal talebine saygı duyması ve uzun süreli operasyonları iptal etmesi gerektiğine dikkat edilmelidir.
ASP.NET Core’da iptal isteklerini dinleme
CancellationToken.IsCancellationRequested özelliğinin değerini aşağıda verilen kod parçacığında gösterildiği gibi yoklayarak iptal isteklerini dinleyebilirsiniz.
while(!cancellationToken.IsCancellationRequested)
{
//Write your code here to perform some operation
}
İptal isteklerini dinlemenin başka bir yolu, aşağıda verilen kod parçacığında gösterildiği gibi ThrowIfCancellationRequested yöntemini çağırmaktır.
while(true)
{
//Write your code here to perform some operation
cancellationToken.ThrowIfCancellationRequested();
}
Ve aşağıdaki kod parçacığında gösterildiği gibi bir geri arama kaydederek iptal isteklerini dinleyebilirsiniz.
WebClient webClient = new WebClient();
cancellationToken.Register(() =>
{
webClient.CancelAsync();
});
ASP.NET Core’da minimal bir API işleyicisi oluşturun
Şimdi uzun süredir devam eden bir isteği simüle edelim ve iptalin nasıl çalıştığını görelim. İlk önce iptal olmadan uzun süredir devam eden bir isteği deneyeceğiz. Aşağıdaki kod parçasını Program.cs dosyasına yazın.
app.MapGet("/hello", async () =>
{
app.Logger.LogInformation("Request started at: "+DateTime.Now.ToLongTimeString());
await Task.Delay(TimeSpan.FromSeconds(5));
app.Logger.LogInformation("Request completed at: " + DateTime.Now.ToLongTimeString());
return "Success";
});
Bu uygulamayı çalıştırdığınızda ve /hello uç noktasına bastığınızda, Şekil 1’de gösterildiği gibi web tarayıcısını yenileyerek isteği durdurmaya çalışsanız bile işleyicinin tamamının çalıştığını göreceksiniz.
Şekil 1: İptal olmadan, istek kullanıcı tarafından iptal edilse bile işleyici bütünüyle yürütülür.
Minimal bir API işleyicisinde CancellationToken kullanın
Aşağıdaki kod listesi, bir CancellationToken’ı uç nokta işleyicimize nasıl enjekte edebileceğinizi ve bu belirteci Task.Delay yöntemine nasıl iletebileceğinizi gösterir.
app.MapGet("/hello", async (CancellationToken token) =>
{
app.Logger.LogInformation("Request started at: " + DateTime.Now.ToLongTimeString());
await Task.Delay(TimeSpan.FromSeconds(5), token);
app.Logger.LogInformation("Request completed at: " + DateTime.Now.ToLongTimeString());
return "Success";
});
Şimdi, uygulamayı çalıştırdığınızda ve /merhaba uç noktasına bastığınızda, istek tamamlanmadan önce web tarayıcısını yenilemek, isteği durduracaktır. İsteğin asla tamamlanmadığını günlüklerden göreceksiniz. Bunun yerine, CancellationToken.IsCancellationRequested özelliği true olarak ayarlanacağı için TaskCancelledException oluşturulur.
İstisna mesajları, Şekil 2’de gösterildiği gibi, iptal edilen istekle ilgili izleme bilgilerini içerecektir.
Şekil 2: İşleyici kodunda iptal kullanıldığında, yarıda kesilen bir istek tamamlanmayacaktır.
ASP.NET Core’da iptal durumunu kontrol etme
Bir iptal belirtecinde iptal istenip istenmediğini sık sık bilmek isteyebilirsiniz. IsCancellationRequested özelliğini inceleyerek iptal durumunu kontrol edebilirsiniz. Belirteç üzerinde iptal istendiyse IsCancellationRequested özelliği true olur (yani, boole değeri true olur), aksi takdirde false olur.
Yukarıda bahsedildiği gibi, iptal belirteci örneği iptal talebinde bulunduysa CancellationToken.ThrowIfCancellationRequested yöntemi bir OperationCanceledException oluşturur.
Aşağıdaki kod parçacığı, belirtecin iptal talebinde bulunup bulunmadığını kontrol etmek için IsCancellationRequested özelliğinin nasıl kullanılabileceğini gösterir. İstek iptal edilmişse, bir OperationCanceledException örneği atılır.
if (token.IsCancellationRequested)
{
app.Logger.LogInformation("Request has been cancelled..");
throw new OperationCanceledException();
}
İptal belirteçlerini kullanmak iyi bir uygulamadır, ancak denetleyici eylem yöntemlerinizde her zaman önerilmez. İstek durumu değiştirirse, böyle bir isteğin iptal edilmesini istemezsiniz. İptal belirteçleri, talebi durdurmanın herhangi bir yan etkisi olmayacağı zaman, önemli kaynakları tüketen uzun süreli aramalar için özellikle yararlıdır.
Son olarak, bu makalenin amaçları doğrultusunda, uzun süredir devam eden bir işlemi simüle etmek için Task.Delay’i kullandık. Bunun yerine, veritabanı aramaları, ağ aramaları, dosya işleme işlemleri, internetten dosya indirme vb. gibi uygulamanızın gereksinimlerine özel uzun süredir devam eden aramaları değiştirebilirsiniz.
Telif Hakkı © 2022 IDG Communications, Inc.
Kaynak : https://www.infoworld.com/article/3674845/how-to-use-cancellation-tokens-in-aspnet-core-7.html#tk.rss_all