Örnek sorular
Csharp Concurrency AsyncZorluk 1
C#'ta await anahtar kelimesi bir Task üzerinde kullanıldığında ne yapar?
- aTask tamamlanana kadar çağıran thread'i bloklar
- bMetodu, thread'i bloklamadan, task tamamlanana kadar askıya alır✓
- cTask henüz başlamadıysa onu anında iptal eder
- dTask'ı senkron bir metot çağrısına dönüştürür
Açıklama:await bir state machine üretir: metodun geri kalanı bir continuation olarak kaydedilir, çağıran thread serbest bırakılır ve task tamamlandığında continuation (genelde bir thread-pool thread'inde) devam eder. Thread bloklanmaz — bu, .Result/.Wait() ile aradaki temel farktır.
Csharp Concurrency AsyncZorluk 1
Bir async void metodun çağırıcısı, o metodun bitişini neden bekleyemez (await edemez)?
- aÇünkü
async void metotlar her zaman senkron çalışır - bÇünkü
async void metotlar hiçbir değer döndürmez - cÇünkü
async void metotların içinde await ifadesi kullanılmasına izin verilmez - dÇünkü
async void, çağırıcıya tutup await edebileceği bir Task vermez✓
Açıklama:Bir async Task metot, çağırıcının await edebileceği, exception'larını gözlemleyebileceği ya da WhenAll/WhenAny ile birleştirebileceği bir Task handle döner. async void bir metot ise hiçbir şey döndürmez — elde tutulacak bir handle olmadığından çağırıcı ne zaman bittiğini ya da exception fırlatıp fırlatmadığını bilemez.
Csharp Concurrency AsyncZorluk 1
C#'taki lock ifadesiyle ilgili aşağıdakilerden hangisi doğrudur?
- aLock monitörü olarak referans tipinde bir nesne gerekir; değer tipi vermek derleme hatası üretir✓
- b
lock, int ya da bir struct gibi herhangi bir değer tipi üzerinde doğrudan kullanılabilir - c
lock yalnızca async işaretli metotların içinde çalışır - dİçinde bulunduğu sınıf garbage collect edildiğinde
lock monitörünü otomatik olarak serbest bırakır
Açıklama:lock (obj) için obj'in referans tipi olması gerekir, çünkü monitör nesnenin kimliğine (heap'teki sync block'una) bağlıdır. Değer tipi vermek derleme zamanı hatasıdır (CS0185); çünkü boxing her seferinde yeni bir nesne oluşturur ve lock hiçbir şeyi gerçekten senkronize etmemiş olur.
Csharp Concurrency AsyncZorluk 1
Bir async metoda CancellationToken.None geçmek ne anlama gelir?
- aİşlemin bir background thread'de çalışacağı garanti edilir
- bHiçbir token verilmediği için metot anında exception fırlatır
- cMetot, asla iptal edilemeyecek bir token alır✓
- dVarsayılan token, işlemi sabit bir süre sonra otomatik iptal eder
Açıklama:CancellationToken.None, IsCancellationRequested değeri her zaman false olan ve hiçbir zaman sinyallenmeyen, gerçek ve geçerli bir CancellationToken değeri döndürür. Gerçekten bir iptal kaynağı yokken geçilecek güvenli yer tutucudur ve kontrol edilmesinin ek bir maliyeti yoktur.
Csharp Concurrency AsyncZorluk 1
Task.CompletedTask genellikle ne için kullanılır?
- aThread pool üzerinde yepyeni bir task başlatmak için
- bUygulamada o an çalışan bütün task'ları iptal etmek için
- cBekleyen tüm task'lar bitene kadar çağıran thread'i bloklamak için
- dZaten tamamlanmış bir
Task singleton'ı; bir Task dönen imzayı karşılamak için kullanışlıdır✓
Açıklama:Task.CompletedTask, önbelleğe alınmış, zaten tamamlanmış bir Task singleton'ıdır. Genelde Task dönmesi gereken bir arayüzü uygulayan ama belirli bir dalda gerçekten async yapılacak bir şeyi olmayan metotlardan döndürülür ve gereksiz bir allocation'dan kaçınır.
Csharp Concurrency AsyncZorluk 1
C#'taki lock (obj) { ... } ifadesi, temelde hangi kalıbın syntactic sugar'ıdır?
- aBloğu saran bir
Interlocked.Increment(ref obj) çağrısı - b
Monitor.Enter(obj) ve ardından Monitor.Exit(obj)'i çağıran bir try/finally✓ - cZaman aşımı sıfır olarak çağrılan bir
SemaphoreSlim.Wait() - dBloğun gövdesini saran bir
Task.Run(() => obj)
Açıklama:Derleyici lock (obj) { body } ifadesini Monitor.Enter(obj); try { body } finally { Monitor.Exit(obj); } şekline indirger (güvenilirlik için iki parametreli Enter aşırı yüklemesiyle). finally, gövde exception fırlatsa bile monitörün serbest bırakılmasını garanti eder.