Szukam wskazówek, jak radzić sobie z poniższą sytuacją.Async Spróbuj (bla) wzór
Tworzę sposoby próbuje dostać w niektórych danych, w następstwie tego wzoru:
// Typical pattern
public bool TryBlah(string key, out object value)
{
// ... set value and return boolean
}
Zabrakło mi na problem, gdy próbuje się do tego wzoru na ich ASYNC wersje, ponieważ nie można używać out
w metodach asynchronicznych:
// 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
}
Jednym z rozwiązań jest zwrócenie krotki zawierającej dane. Działa to w przypadku metod zwracających pojedynczy typ danych:
// Tuple version
public async Task<Tuple<bool, object>> TryBlah(string key)
{
// ... perform some slow io, return new Tuple<bool, object>(...)
}
Problem polega na tym, że chcesz zwrócić różne typy danych. Bez użycia asynchronizacji można utworzyć kilka metod z niemal identycznymi podpisami, jak:
public bool TryBlah(string key, out byte[] value)
{
// ...
}
public bool TryBlah(string key, out string value)
{
// ...
}
To świetnie. Właśnie tego chcę zrobić. Ten api jest bardzo prosty i łatwy w obsłudze (nazwy metod są takie same, tylko dane przekazywane w zmianach).
Nie można jednak użyć metody out
przy pomocy metod asynchronicznych.
Jednym ze sposobów obejścia tego problemu jest zwrócenie Tuple
swoich danych. Jednak teraz nie można mieć niemal identycznych podpisów metod, takich jak:
// 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)
{
// ...
}
Te metody nie działają, ponieważ mają te same podpisy. Jedynym sposobem, aby obejść ten, który przychodzi na myśl to, aby dać każdej metody odrębną nazwę, tak jak poniżej:
public async Task<Tuple<bool, byte[]>> TryBlahByteArray(string key)
{
// ...
}
public async Task<Tuple<bool, string>> TryBlahString(string key)
{
// ...
}
Mój problem jest to, że teraz tworzy co uważam za paskudny api gdzie masz teraz dużo różnych metod. Tak, to nie jest tak duży problem, ale czuję, że musi być lepszy sposób.
Czy istnieją inne wzorce, które nadają się do ładniejszego interfejsu API podczas pracy z takimi asynchronicznymi metodami? Jestem otwarty na wszelkie sugestie.
Czy czuję Promises in C#? – cgatian