private static void ProcessEpistleException(Signal e, Exception ex) { FireUnexpectedException(null, e, ex); }
/// <summary> /// Оповещение о непредвиденном сбое /// </summary> /// <param name="sender">Источник</param> /// <param name="signal">Сигнал находившийся в обработке</param> /// <param name="e">Исключение</param> static void FireUnexpectedException(object sender, Signal signal, Exception e) { if (UnexpectedException != null) { UnexpectedException(sender, SignalRoute.GetFastRouteKey(signal.Key, signal.State), signal._state, e); } }
private static void ProcessEpistle(Signal signal) { if (signal != null) { var resultSet = new List<SignalExecuteResult>(); var noSubscribers = true; try { var fk = SignalRoute.GetFastRouteKey(signal.Key, signal.State); if (_signalRouteTable.ContainsKey(fk)) { noSubscribers = false; foreach (var route in _signalRouteTable[fk]) { if (route.ExactEqualRoute(fk, signal.State)) { foreach (SignalSubscriber es in route.Subsribers) { object result = null; bool success = true; try { result = es.ProcessSignal(signal); } catch (Exception ex) { success = false; signal.AsyncResult.AppendException(ex); // Рассылка оповещений о сбое при обработке сигнала var exSignal = new Signal(signal.Key, es.InstanceName, signal.State, ex); if (_signalExceptionRouteTable.ContainsKey(fk)) { foreach (var exRoute in _signalExceptionRouteTable[fk]) { foreach (SignalSubscriber exSubscribers in exRoute.Subsribers) { try { exSubscribers.ProcessSignal(exSignal); } catch (Exception exSubscriberException) { FireUnexpectedException(exSubscribers.InstanceName, exSignal, exSubscriberException); } } } } FireProcessSignalException(es.InstanceName, signal, ex); } resultSet.Add(new SignalExecuteResult(es.InstanceName, success, result)); } } } } if (_signalComletedRouteTable.ContainsKey(fk)) { noSubscribers = false; foreach (var route in _signalComletedRouteTable[fk]) { if (route.ExactEqualRoute(fk, signal.State)) { foreach (SignalSubscriber es in route.Subsribers) { try { es.ProcessSignal(signal); } catch (Exception ex) { FireUnexpectedException(es.InstanceName, signal, ex); } } } } } if (noSubscribers) { FireNoSignalSubscribers(signal); } } finally { signal.AsyncResult.Complete(resultSet); } } }
/// <summary> /// Оповщение о сбое при обработке сигнала /// </summary> /// <param name="sender">Источник</param> /// <param name="signal">Сигнал находившийся в обработке</param> /// <param name="e">Исключение</param> static void FireProcessSignalException(object sender, Signal signal, Exception e) { if (ProcessSignalException != null) { ProcessSignalException(sender, SignalRoute.GetFastRouteKey(signal.Key, signal.State), signal.State, e); } }
static void FireNoSignalSubscribers(Signal signal) { if (NoSignalSubscribers != null) { NoSignalSubscribers(SignalRoute.GetFastRouteKey(signal.Key, signal.State), signal.State); } }
/// <summary> /// Генерация сигнала /// </summary> /// <param name="signal">Сигнал</param> /// <param name="state">Аргументы</param> public static SignalAsyncResult Send(object signal, Action<SignalAsyncResult> asyncCallback, params object[] state) { if (!Stopped) { var s = new Signal(signal, state, asyncCallback); // Передача сигнала в наименее загруженный поток EpistleProcessor.Push(s); foreach (var p in proxies) p.Send(signal, state); return s.AsyncResult; } return DisposedResult; }
/// <summary> /// Генерация сигнала /// </summary> /// <param name="signal">Сигнал</param> public static SignalAsyncResult Send(object signal) { if (!Stopped) { var s = new Signal(signal, null); // Передача сигнала в наименее загруженный поток EpistleProcessor.Push(s); foreach (var p in proxies) p.Send(signal, null); return s.AsyncResult; } return DisposedResult; }
/// <summary> /// Обработка сигнала, с проверкой типов переданных аргументов по отношению к аргументам метода-приемника /// </summary> /// <param name="signal">Сигнал</param> internal object ProcessSignal(Signal signal) { return _method.DynamicInvoke((null == signal.State) ? new object[0] : signal.State); }