.net 在Rx中尝试打印输出重试(5)次

kkbh8khc  于 2023-02-01  发布在  .NET
关注(0)|答案(1)|浏览(133)

我正在学习Rx,我想知道我如何才能打印出重试到控制台,例如“重试#1”,“重试#2”等。我看到一些人使用.Dump扩展方法,我找不到。

using System.Reactive.Concurrency;
using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;

var test = new Test(new HttpClient());
var result = await test.GetAsync();
Console.WriteLine($"Result: {result}");

public sealed class Test
{
    private readonly HttpClient _httpClient;

    public Test(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public Task<string> GetAsync()
    {
        return Observable
            .FromAsync(() => _httpClient.GetAsync("http://www.mocky.io/v2/5e307edf3200005d00858b49"))
            .SubscribeOn(TaskPoolScheduler.Default)
            .Retry(5)
            .Timeout(TimeSpan.FromSeconds(5))
            .Do(x => Console.WriteLine($"Is message successful? {x.IsSuccessStatusCode}"))
            .SelectMany(async x =>
            {
                var response = await x.Content.ReadAsStringAsync();
                return response;
            })
            .Catch<string, TimeoutException>(_ => Observable.Return("Timeout"))
            .Catch<string, Exception>(ex => Observable.Return(ex.Message))
            .ToTask();
    }
}
nbysray5

nbysray51#

下面是写出重试的一个基本示例:

Observable
    .Defer<int>(() =>
    {
        int counter = 0;
        return
            Observable
                .Defer<int>(() =>
                {
                    Console.WriteLine(counter++ > 0 ? $"Retry #{counter - 1}" : "First");
                    return Notification.CreateOnError<int>(new Exception()).ToObservable();
                })
                .Retry(5);
    })
    .Subscribe(
        x => Console.WriteLine(x),
        e => Console.WriteLine(e.Message));

这将输出:

First
Retry #1
Retry #2
Retry #3
Retry #4
Exception of type 'System.Exception' was thrown.

你重试的可观察对象应该被 Package 在Observable.Defer中,以防止重复值的可能性,而且,每当我在可观察对象中使用"外部"状态时,我也会将其 Package 在Observable.Defer中。

相关问题