Alcune informazioni di base.
Sto imparando lo stack dell'API Web e sto cercando di incapsulare tutti i dati sotto forma di un oggetto "Risultato" con parametri come Success ed ErrorCodes.
Metodi diversi, tuttavia, produrrebbero risultati e codici di errore diversi, ma l'oggetto risultato verrebbe generalmente istanziato allo stesso modo.
Per risparmiare un po 'di tempo e anche per saperne di più sulle funzionalità di asincronizzazione / attesa in C #, sto cercando di racchiudere tutti i corpi dei metodi delle mie azioni API Web in un delegato di azioni asincrono, ma sono stato preso in un attimo ...
Date le seguenti classi:
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;
}
}
}
Voglio scrivere un metodo che esegue un'azione su un oggetto risultato e restituirlo. Normalmente attraverso i metodi sincroni sarebbe
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Ma come posso trasformare questo metodo in un metodo asincrono usando async / waitit?
Questo è quello che ho provato:
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()
in un metodo, tale metodo dovrebbe essere asincrono e restituire un punto in Task<T>
cui T
sarebbe stato restituito il metodo sincrono. L'idea è che in questo modo, ogni chiamante del tuo metodo può quindi "attendere in modo asincrono" (non so quale sia un buon termine per questo) affinché il sottostante Stream.ReadAsync()
sia completato. Una metafora per questo che puoi usare è che l'asincrono è "infettivo" e si diffonde dall'I / O integrato di basso livello in un altro codice i cui risultati dipendono da quelli di detto I / O.
new
inserendo ilT
, perché il tuo metodo deve essere asincrono? AFAIK nel codice usando API asincrone, devi solo propagare l'async
intuizione da altri metodi che usi.