#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);