Что вернуть как onRetryAsyn c? - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь реализовать политику повторных попыток, которая будет повторяться при возникновении исключения.

К сожалению, я не могу получить правильную подпись для блока onRetryAsyn c. Компилятор говорит: «Не все пути кода возвращают значение в лямбда-выражении типа…» текущие библиотеки, которые я вынужден использовать.

var retryPolicy = Policy
                    .Handle<SigsThrottledException>(e => e.RetryAfterInSeconds > 0)
                    .WaitAndRetryAsync(
                        retryCount: 3,
                        sleepDurationProvider: (i, e, ctx) =>
                        {
                            var ste = (SigsThrottledException)e;
                            return TimeSpan.FromSeconds((double)ste.RetryAfterInSeconds);
                        },
                        onRetryAsync: (e, ts, i, ctx) =>
                        {
                            // Logging goes here
                        });

<....>

var response = await retryPolicy.Execute(async () =>
        {
            Uri substrateurl = new Uri("https://substrate.office.com/");
            return await SIGSClient.Instance.PostAsync(client, substrateurl, new UserInfo(), "faketoken", new Signal(), Guid.NewGuid()).ConfigureAwait(false);
        }
        );

1 Ответ

0 голосов
/ 10 марта 2020

Итак: это тот случай, когда компилятор менее чем полезен, что усугубляется тем, что async / await et c. все еще довольно нов для меня, и не всегда это легко понять.

По сути, я упустил одну вещь:

onRetryAsync: async (e, ts, i, ctx) =>

... асин c перед подпись, которая, кстати, отсутствовала в примерах кода, на которые я ссылался.

Тип аргумента onRetryAsyn c - Func<Exception, TimeSpan, int, Context, Task>, и его можно объявить так:

Func<Exception, TimeSpan, int, Context, Task> nopBlock = async (e, ts, i, ctx) =>
        {
            // Do something here
            // The "something" should be async
        };

В конце концов я понял это, посмотрев на сигнатуру перегрузки WaitAndRetryAsyn c, которую я вызывал.

...