Tamam, kulağa garip geliyor, ancak kod çok basit ve durumu iyi açıklıyor.
public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
AssertNotDisposed();
var roles = await GetRolesForUser(user);
roles.Roles = RemoveRoles(roles.Roles, role);
await Run(TableOperation.Replace(roles));
}
(Aşağıdaki özette biraz bahsettiğimi biliyorum, ama yukarıdaki gerçek üretim kodunun ne olacağından gerçek bir yöntem. zaman uyumsuz / beklemede bir doğruluk için.)
async
/ await
Daha fazla kullandığım için bu model ile daha sık karşılaşıyorum . Desen aşağıdaki olay zincirinden oluşur:
- Çalışmam gereken bazı bilgileri bana getiren ilk aramayı bekliyor
- Bu bilgiler üzerinde eşzamanlı çalışma
- Güncellenmiş çalışmayı kaydeden son bir çağrı beklemek
Yukarıdaki kod bloğu genellikle bu yöntemleri işleme hakkında nasıl olduğunu. Ben await
bunu asenkron olduğundan gereken ilk çağrı. Sonra, IO veya kaynak bağlı olmayan ve bu nedenle zaman uyumsuz olmayan yapmam gereken işi yapıyorum. Sonunda, aynı zamanda bir async
çağrı olan işimi saklıyorum ve kargo kültünden çıkarıyorum await
.
Ancak bu, bu modeli ele almanın en etkili / doğru yolu mu? Bana öyle geliyor ki await
son çağrıyı atlayabilirim , ama başarısız olursa? Eşzamanlı çalışmamı orijinal çağrı ile zincirlemek için bir Task
yöntem kullanmalı ContinueWith
mıyım? Şu anda bunu doğru bir şekilde ele alıp almadığımdan emin olmadığım bir noktadayım.
Örnekteki kod verildiğinde, bu async / sync / async yöntemi çağrı zincirini işlemenin daha iyi bir yolu var mı?