Biraz arka plan bilgisi.
Web API yığınını öğreniyorum ve tüm verileri Başarı ve Hata Kodları gibi parametrelerle bir "Sonuç" nesnesi biçiminde kapsüllemeye çalışıyorum.
Bununla birlikte, farklı yöntemler, farklı sonuçlar ve hata kodları üretir, ancak sonuç nesnesi genellikle aynı şekilde somutlaştırılır.
Biraz zaman kazanmak ve ayrıca C # 'da eşzamansız / bekleme yetenekleri hakkında daha fazla bilgi edinmek için, web api eylemlerimin tüm yöntem gövdelerini eşzamansız bir eylem temsilcisine sarmaya çalışıyorum, ancak biraz engelle karşılaştım ...
Aşağıdaki sınıflar göz önüne alındığında:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Result nesnesi üzerinde bir eylem gerçekleştiren ve onu döndüren bir yöntem yazmak istiyorum. Normalde eşzamanlı yöntemlerle bu,
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Ama bu yöntemi async / await kullanarak asenkron bir yönteme nasıl dönüştürebilirim?
Bu denediğim şey:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
Stream.ReadAsync()
, bu yöntemin kendisi zaman uyumsuz olmalı ve yöntem eşzamanlı olduğunda döndürdüğünüz bir Task<T>
yere dönmelidir T
. Buradaki fikir, bu şekilde, yönteminizi arayan her kişinin, temelin tamamlanması için "eşzamansız olarak" (bunun için iyi bir terim olduğunu bilmiyorum) beklemesidir Stream.ReadAsync()
. Bunun için kullanabileceğiniz bir metafor, zaman uyumsuzluğun "bulaşıcı" olması ve düşük seviyeli yerleşik G / Ç'den sonuçları söz konusu G / Ç'ninkilere bağlı olan diğer koda yayılmasıdır.
new
Yukarıya çıkıyorsanızT
, yönteminizin neden asenkron olması gerekiyor? Eşzamansız API'leri kullanan kodda AFAIK , yalnızcaasync
kullandığınız diğer yöntemlerden olanı yaymanız gerekir .