Fatih'in Notları – WaitAll… WhenAll… Hangisi Ne Zaman??!
Asenkron programlama ile ilgili sunumlarım sonrasında aldığım sorulardan belki de en ilginci buydu; WaitAll… WhenAll… peki ama hangisi ne zaman kullanılmalı? Birbirleri yerine kullanabilir miyim? Aralarında bir fark var mı? Bu soruya yanıt vermek için isterseniz her ikisini de sırasıyla inceleyelim;
.Net framework 4 ve Task Parallel Library ile birlikte hayatımıza giren Task sınıfı içerisinde yer alan WaitAll fonksiyonu, başlatılan bir grup işlem (task) bitene kadar içerisinde bulunduğumuz fonksiyonun devamının işletilmesi engel olaraktır. Bunu yapabilmek içinde belirtilen tüm işleri takip edecek ve bu işler bitene kadar fonksiyondan çıkılmayacaktır. Dolayısıyla da işler bitene kadar WaitAll fonksiyonun çağrıldığı satırdan bir alt satıra geçilemeyeceği için fonksiyonun davamı bekletilmiş olacaktır.
Asenkron programlama, Async CTP ile birlikte hayatımıza giren TaskEx sınıfı içerisinde yer alan WhenAll fonksiyonu, başlatılan bir grup işlem (task) bitene kadar içinde bulunduğu fonksiyonun devamının işletilmemesini sağlamaktadır. Kendisi de asenkron bir fonksiyon olan ve bir Task nesnesi dönen WhenAll, diğer asenkron fonksiyonlar gibi derlenme zamanında yorumlanarak işin bitmesi sonrasında kodun devamının işletilmesi için gerekli değişikliklerin yapılmasını sağlayacaktır. Asenkron bir fonksiyon olması nedeniyle de aşağıdaki şekilde kullanılabilmektedir;
await TaskEx.WhenAll(is1, is2, is3, ….);
Görüldüğü gibi temelde her iki fonksiyon da aynı amaçla kullanılmakta; fakat aralarındaki en önemli fark içinde bulundukları iş parçacığının kilitlenmesi/bekletilmesidir. WaitAll, devam kodunun işletilmesini önlemek adına işlemler bitene kadar fonksiyondan çıkmayarak aynı zamanda içinde bulunduğu iş parçacığını da kilitleyecektir. Eğer içerisinde bulunan kod ara yüz iş parçacığı dışındaki herhangi bir iş parçacığı ise bu durum bir genelde bir problem oluşturmayacak; fakat ara yüz iş parçacığında bulunması durumunda tüm işler bitene kadar ara yüz kullanıcılara yanıt veremeyecek ve bu durum da uygulamada donma olarak yorumlanacaktır. Bu, doğal olarak, hiç bir son kullanıcı tarafından istenen bir durum değildir ve size olumsuz bir geri dönüşü olacaktır. Öte yandan WhenAll, işleyişin devamını bekletmek için farklı bir yol takip etmektedir, bunun için asenkron programlamanın nimetlerinden faydalanacaktır. WhenAll fonksiyonu çağrıldığında yeni bir iş daha oluşturularak belirtilen işlerin bitimi burada beklenecektir. Derleme zamanında ise bu kod yorumlanarak kodun devamının WhenAll işinin bitiminde asenkron olarak çalıştırılabilmesi için gerekli değişiklikler yapılacaktır. Ortaya çıkan kod ise tamamen asenkron olarak işleyeceğinden ara yüz iş parçacığında bile çalıştırılsa ara yüzün yanıt verir durumda kalmasını sağlayarak donma olmasının önüne geçecek ve son kullanıcıdan olumsuz geri dönüşleri engelleyecektir. Yukarıda paylaşmış olduğum bu fark kesinlikle WhenAll’u her zaman WaitAll yerine kullanılması gerektiği anlamına gelmemektedir. İş mantığınıza göre her ikisinin de kullanılabileceği senaryolar mutlaka olacaktır. Aralarındaki farkı tam olarak biliyor olmak, doğru fonksiyonu doğru yerde kullanma şansı verecektir.
Windows için Kinect SDK Fatih Boy
Jul 31 12:43