Я пишу некоторый код с использованием RX в C#, который должен взаимодействовать со старой системой, генерируя события.
В целом, у меня есть наблюдаемое и мне нужно генерировать одно событие, когда наблюдаемое завершается, а другое событие, если обнаружено исключение тайм-аута. Основная проблема в том, как лучше всего обработать исключение.
Я относительно новичок в RX, поэтому, хотя я нашел решение, я не могу быть уверен, что нет лучшего или более подходящего способа который лучше использует расширения RX.
Это не настоящий код, но указывает на структуру моего мышления:
public delegate void SuccessHandler(object sender, SuccessEventArgs e);
public event SuccessHandler OnSuccess;
public delegate void TimeoutHandler(object sender, TimeoutEventArgs e);
public event TimeoutHandler OnTimeout;
var id;
var o = Observable.Return() // <- this would be a fetch from an asynchronous source
.Where(r=>r.status=="OK")
.Timeout(new Timespan(0,0,30)
.Do(r=> {
id=r.Id // <-- Ugh! I know this shouldn't be done!
}
.Subscribe(r => {
var statusResponse= new StatusResponse()
{
Id = r.Id
Name = r.Name
Message = "The operation completed successfully",
Status = Status.Success
};
if (OnSuccess == null) return;
OnSuccess (this, new SuccessEventArgs(statusResponse);
},
e =>
{
_logger.LogError(e, "A matching response was not returned in a timely fashion");
if (OnTimeout == null) return;
OnTimeout(this, new TimeoutEventArgs(id));
});
Если мне не нужно было обнаруживать тайм-аут и действовать по нему было бы хорошо; Я уже разработал, как заменить Subscribe для ToEventPattern:
...
.Select(r =>
{
var statusResponse= new StatusResponse()
{
Id = r.Id
Name = r.Name
Message = "The operation completed successfully",
Status = Status.Success
};
return new EventPattern<SuccessEventArgs>(this, new SuccessEventArgs(statusResponse));
})
.ToEventPattern();
Однако я хотел бы иметь возможность определить время ожидания (и, возможно, другие исключения). мои эксперименты с Catch не увенчались успехом, потому что я не могу правильно выстроить типы, возможно потому, что я не совсем понимаю, что происходит.
Я очень ценю мнения по этому поводу. , Это приемлемое решение? Как я могу улучшить это? Может ли кто-нибудь указать мне некоторые хорошие онлайн-ссылки, которые объяснят, как можно осуществлять управление потоком данных и обработку исключений (все примеры, которые я видел до сих пор, похоже, не дотягивают до реального случая, когда вы хотите выполнить излучение). событие и объединяют это с обработкой исключений).
Заранее спасибо