Sto cercando consigli su come gestire la seguente situazione.Async Try (blah) pattern
Sto creando metodi per cercare di ottenere alcuni dati, seguendo questo schema:
// Typical pattern
public bool TryBlah(string key, out object value)
{
// ... set value and return boolean
}
ho incontrato un problema quando si cerca di seguire questo modello in poi Async versioni perché non è possibile utilizzare out
sui metodi asincroni:
// Ideal async pattern (not allowed to use an 'out' parameter, so this fails)
public async Task<bool> TryBlah(string key, out object value)
{
// ... set value, perform some slow io operation, return bool
}
Una soluzione è di restituire una tupla contenente i dati. Funziona per metodi che restituiscono un singolo tipo di dati in questo modo:
// Tuple version
public async Task<Tuple<bool, object>> TryBlah(string key)
{
// ... perform some slow io, return new Tuple<bool, object>(...)
}
Il problema si verifica quando si desidera restituire tipi di dati diversi. Senza utilizzare async è possibile creare diversi metodi con firme quasi identiche in questo modo:
public bool TryBlah(string key, out byte[] value)
{
// ...
}
public bool TryBlah(string key, out string value)
{
// ...
}
Questo è grande. Questo è quello che sto cercando di fare. Questa API è molto semplice e facile da usare (i nomi dei metodi sono tutti uguali, solo i dati che vengono passati nelle modifiche).
Non essendo in grado di utilizzare out
con metodi asincroni, questo però lo rovina.
Un modo per aggirare questo è restituire un Tuple
dei dati. Tuttavia ora non è possibile avere firme di metodo pressoché identiche come la seguente:
// The suck... the signatures match, but you want to return different values.
// You can't do this:
public async Task<Tuple<bool, byte[]>> TryBlah(string key)
{
// ...
}
public async Task<Tuple<bool, string>> TryBlah(string key)
{
// ...
}
Questi metodi falliscono perché hanno le stesse firme. L'unico modo per ovviare a questo che viene in mente è quello di dare ad ogni metodo un nome diverso, in questo modo:
public async Task<Tuple<bool, byte[]>> TryBlahByteArray(string key)
{
// ...
}
public async Task<Tuple<bool, string>> TryBlahString(string key)
{
// ...
}
Il mio problema è che questo crea ora quello che considero un brutto api dove ora avete un bel po ' di diversi metodi. Sì, non è un grosso problema, ma sento che ci deve essere un modo migliore.
Ci sono altri schemi che si prestano a una API più bella quando si lavora con metodi asincroni come questo? Sono aperto a qualsiasi suggerimento.
Ho odore di promesse in C#? – cgatian