Перехват метода C # в сети rx

#c# #try-catch #observable #rx.net

#c# #попытка-перехват #наблюдаемый #rx.net

Вопрос:

у меня есть служба, которая работает с выражениями cron

     public Task DoProcessAsync()
    {
        return transactionService.CommitAsync(() => DoProcess());
    }

    private async Task DoProcess()
    {
        try{...}

        catch{logger.logError("error");}
    }
  

Но я знаю, что блок try catch в этом месте мне не подходит, потому что фиксация будет принята.
Также у меня есть

     public Task Start()
    {
        exportCron = CronExtensions
             .Cron(sheduleConfiguration.SetCitiesCronExpression)
             .Select(x => Observable.FromAsync(() => setCitiesToClientsService.DoProcessAsync()))
             .Concat()
             .Subscribe();

        return Task.FromResult(0);
    }
  

Так, может быть, я могу поместить метод catch() в это расширение? Если да, то как я могу это сделать?

Я нашел

 .Subscribe(onNext => { }, onError => { logger.LogError("Error"); } );
  

Но последовательность перестала работать после ошибки, но должна продолжаться. Есть какие-то предложения?

Ответ №1:

 public async Task DoProcess()
{
    try
    {
        await Start();
    }
    catch (Exception e)
    {
    }
}

public Task DoProcess()
{
    try
    {
        Start().Wait();
    }
    catch (Exception e)
    {
    }
} 
  

Комментарии:

1. В этом случае у меня есть PlaginBootstrapper, который запускает все задания

2. foreach (задание переменной в заданиях) ожидает задания. Start();

Ответ №2:

Вы можете использовать для вас наблюдаемое определение: повторите попытку (5), она повторяется 5 раз, или повторите попытку () бесконечно.

Пример:

          Observable testObservable =
            Observable
                .Interval(TimeSpan.FromMilliseconds(20000))
                .Select(x => WhatEver()).ObserveOn(SynchronizationContext.Current)
                .Retry(retry);