예제 #1
0
파일: SignalStatic.cs 프로젝트: ogoun/Foton
 private static void ProcessEpistleException(Signal e, Exception ex)
 {
     FireUnexpectedException(null, e, ex);
 }
예제 #2
0
파일: SignalStatic.cs 프로젝트: ogoun/Foton
 /// <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);
     }
 }
예제 #3
0
파일: SignalStatic.cs 프로젝트: ogoun/Foton
 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);
         }
     }
 }
예제 #4
0
파일: SignalStatic.cs 프로젝트: ogoun/Foton
 /// <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);
     }
 }
예제 #5
0
파일: SignalStatic.cs 프로젝트: ogoun/Foton
 static void FireNoSignalSubscribers(Signal signal)
 {
     if (NoSignalSubscribers != null)
     {
         NoSignalSubscribers(SignalRoute.GetFastRouteKey(signal.Key, signal.State), signal.State);
     }
 }
예제 #6
0
파일: SignalStatic.cs 프로젝트: ogoun/Foton
 /// <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;
 }
예제 #7
0
파일: SignalStatic.cs 프로젝트: ogoun/Foton
 /// <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;
 }
예제 #8
0
 /// <summary>
 /// Обработка сигнала, с проверкой типов переданных аргументов по отношению к аргументам метода-приемника
 /// </summary>
 /// <param name="signal">Сигнал</param>
 internal object ProcessSignal(Signal signal)
 {
     return _method.DynamicInvoke((null == signal.State) ? new object[0] : signal.State);
 }