Bir süre C # 'in async / await pattern ile uğraştıktan sonra, aniden şu kodda ne olduğunu açıklayacağımı gerçekten bilmediğimi fark ettim:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
Task
devam edildiğinde bir iplik anahtarına neden olabilecek veya olmayabilecek bir beklenen değeri döndüreceği varsayılmaktadır .
Bekleyen bir döngü içinde olmasaydı kafam karışmazdı. Doğal olarak yöntemin geri kalanının (yani devam) potansiyel olarak başka bir iş parçacığında çalışmasını beklerim.
Ancak, bir döngü içinde, "yöntemin geri kalanı" kavramı bana biraz sisli oluyor.
İş parçacığı devam ettirilirse açık değilse, açık değilse "döngünün geri kalanı" ne olur? Döngünün sonraki yinelemesi hangi iş parçacığında yürütülür?
Gözlemlerim, devamlamanın başka bir işlemde yürütülürken her yinelemenin aynı iş parçacığında (orijinal olan) başladığını (kesin olarak doğrulanmadı) gösteriyor. Bu gerçekten olabilir mi? Evetse, bu GetWorkAsync yönteminin iş parçacığı güvenliği açısından dikkate alınması gereken bir derece beklenmedik paralellik midir?
GÜNCELLEME: Sorum, bazılarının önerdiği gibi kopya değil. while (!_quit) { ... }
Kod kalıbı yalnız benim gerçek kod basitleştirilmiş bir şeklidir. Gerçekte, iş parçacığım girdi iş kuyruğunu düzenli aralıklarla (varsayılan olarak her 5 saniyede bir) işleyen uzun ömürlü bir döngüdür. Gerçek çıkış koşulu kontrolü, örnek kodun önerdiği gibi basit bir saha kontrolü değil, bir olay tutma kontrolüdür.