Cancellation Token Kullanımı
Cancellation Token İhtiyacını Anlamak
Hiç kullandığınız bir uygulamada yanlış bir iş yapıp ardından işlem devam ederken yapılan işlem iptal olsun diye uygulamayı kapattığınız oldu mu? Peki uygulamayı kapatınca işlem iptal mi oldu yoksa tamamlandı mı? Veya API’ ye atılan bir istekte isteğin yanıtı uzun sürdüğünde isteği beklemek yerine iptal etmek isteyebiliriz. Peki atılan isteği nasıl iptal edebiliriz?
Başlıkta da gördüğünüz teknolojiyi kullanmıyorsanız ve apiye isteğiniz gittikten sonra uygulamayı kapatsanız dahi api isteği aldığı için işlemine devam edecektir. Veya isteği iptal edemediğimiz için mecburen bekleyeceğiz.
İşte bu noktada Cancellation Token bizim imdadımıza yetişiyor.
Peki yazılım geliştiriciler olarak bunu nasıl kullanırız?
Paralel programlama işlemlerinde CancellationToken tipinde bir parametre vardır. CancellationTokenSource ile CancellationToken sınıfını kullanarak Cancel metodu ile devam eden Task’ı da iptal edebiliriz.
Task sınıfına ait bir bölüm. Bu parametreyi verdiğimizde task iptal edildiği anda task’ı throw eder. Böylece bizim devam eden işlemlerde iptal edilir.
Örnek bir API hazırladım. Bu örnekte CancellationToken parametresini alan ve almayan 2 adet endpoint bulunmaktadır. Postman ile 2 endpointe ayrı ayrı istek atıp istek işlemdeyken isteği iptal edeceğiz ve Output’u inceleyeceğiz.
Şimdi postmandan 2 endpointe de istek yapıp iptal edeceğim ve Output çıktısına bakalım. Beklenen sonuç output da sadece CancellationToken kullandığımız metodun hatasının yazılması.
Ayrıca GetDays endpointine istek atacağım ve ardından Postman’dan isteği iptal edeceğiz. Beklediğimiz sonuç ise isteğin iptal olmasına rağmen breakpoint ile return ifadesine gelmemiz. Çünkü CancellationToken kullanılmadığı için işlemin iptalini gerçekleştirecek herhangi bir kodumuz yok.
ThrowIfCancellationRequested
WebAPI ye istek attığımızda yukarıdaki yapıyı kullanabiliyoruz fakat diğer teknolojilerde (web, masaüstü gibi) işlemleri nasıl iptal edebiliriz diye soruyorsanız eğer bu kod tam olarak size göre.
Aşağıdaki örnekte sonsuz bir for döngüsü var ve i değeri 100. ifade de CancellationToken işlemimizi Cancel ediyoruz. Böylece ilk 100 işlemde exception hatası almazken 101. değer de OperationCancelledException fırlatılıyor.
Makalede kullanılan kodları aşağıdaki github bağlantımdan inceleyebilirsiniz.
Kaynaklar: