Uniwersalna metoda, która zwraca wartość lub void

Odpowiedz Nowy wątek
2019-03-15 10:58
0

Cześć, mam taką sytuację.
Mam metodę, która opakowuje fragment kodu w try..catch.

Wygląda to mniej więcej tak:

        void DoAction(Action action, int tryCount = 0, int retrySleep = 0)
        {
            Exception lastException = null;

            int tries = 0;
            if (tryCount == 0)
                tryCount = TRY_COUNT;

            if (retrySleep == 0)
                retrySleep = RETRY_SLEEP;

            while (tries < tryCount)
            {
                try
                {
                    action();
                    return;
                }
                catch (Exception ex)
                {
                    if (ex.HResult == RPC_E_SERVERCALL_RETRYLATER || ex.HResult == RPC_E_CALL_REJECTED)
                    {
                        tries++;
                        System.Threading.Thread.Sleep(retrySleep);
                        lastException = ex;
                    }
                    else
                        throw;
                }
            }

            throw lastException;
        }

Generalnie, jeśli wystąpi pewien wyjątek, to wtedy powtarzam wykonanie kodu po pewnym czasie. I super, wszystko działa.
Tyle, że mam drugą metodę, która zwraca jakąś wartość. Jest identyczna. Poza tym, że w parametrze przyjmuje Func zamiast Action i zwraca rezultat.
Czy jest jakaś opcja, żeby zamiast tych dwóch metod zrobić jedną jakąś uniwersalną?

Pozostało 580 znaków

2019-03-15 19:11

Może spróbuj Polly zamiast samemu to pisać?
https://github.com/App-vNext/Polly

Co do refactoring, jako że w jednym wypadku coś zwracasz a w drugim nie to jednej uniwersalnej metody nie ma... chyba, że użyjesz Polly i po prostu będziesz używać tych samych Policy. Możesz sobie stworzyć PolicyCreator zwracający Ci te Policy i użyć gdzie chcesz później. Wtedy raz to skonfigurujesz a użyjesz sobie dla czegokolwiek:

var result = policy.Execute(() => DoSomething());
policy.Execute(() => DoSomethingElse());

Pozostało 580 znaków

2019-03-15 21:37
0

Polly jak najbardziej, ale w przypadku Twojej implementacji to też nie problem:

Action action;
DoAction(action);
DoAction(() => DoSomething());
T result;
DoAction(() =>{ result = DoSomethingElse() });
var input = "test";
T result2;
DoAction(() =>{ result2 = DoSomethingElse(input ) });

etc.

edytowany 1x, ostatnio: czesiek, 2019-03-15 21:38

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0