Как правильно реализовать Polly в моем коде, чтобы избежать зависания - PullRequest
1 голос
/ 11 июля 2019

У меня проблема с Полли, из-за которой поток зависает. Как вы можете видеть под методом GetData () собирается сгенерировать исключение. Я хочу сделать, это перейти к Dostuff1 и 2, когда возникают исключения в методе GetData () в DoStuff (); Но похоже, что после попытки с Полли он просто застрял и ничего не делает ...

Как я могу это исправить?

private async Task StartUp()
{
        await DoStuff());
        // await next task DoStuff1();
        // await next task DoStuff2();
}


private async Task DoStuff()
{
        var data= await Task.WhenAll(Task.Run(() => GetData()));

        // Do stuff with the data
}


private async Task<Data> GetData()
{
     //read filepaths from file.

     var tasks = filePaths
             .Select(f => polly.MyPolicy().Execute(() => ReadDataFromCSV()))
             .ToArray();
    Return await tasks;
}

private Dictionary<string, DateTime?> ReadDataFromCSV()
{

     ///Throw exception....
}

    public PolicyForGetData()
    {
        return Policy
                 .Handle<Exception>()
                 .WaitAndRetry(
                    retryCount: 2,
                    sleepDurationProvider: t => TimeSpan.FromSeconds(5),
                    onRetry: (ex, t, i, c) => {
                        Console.WriteLine(ex.Message);
                    }
                 );
    }

1 Ответ

1 голос
/ 11 июля 2019

Я думаю, вы не понимаете, как ведет себя Полли. Предполагая, что GetData() всегда выбрасывает, ваше приложение будет работать так

  1. GetData () выбрасывает
  2. Полли ловит повторные попытки в первый раз
  3. GetData () снова выбрасывает
  4. Полли ловит повторные попытки второй раз
  5. GetData () выбрасывает в последний раз.
  6. Полли не будет перехватывать или повторять исключение, потому что вы только попросили его повторить дважды, вместо этого Исключение сбрасывается на метод StartUp(), который предотвращает вызов DoStuff1() и DoStuff2().

Например. Выход этой программы:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Policy
                 .Handle<Exception>()
                 .WaitAndRetry(
                    retryCount: 2,
                    sleepDurationProvider: t => TimeSpan.FromSeconds(5),
                    onRetry: (ex, t, i, c) => {
                        Console.WriteLine("OnRetry");
                    }
                 )
                 .Execute(() => ErrorMethod());

            Console.WriteLine("We never get here");
        }
        catch (Exception)
        {
            Console.WriteLine("Exception Handler");
        }
    }

    private static void ErrorMethod()
    {
        throw new InvalidOperationException("Badness");
    }
}

1024 * Есть *

OnRetry
OnRetry
Exception Handler
...