protected void InvokeEventHandler(object eventObject, Action <bool, Exception, object, Type> resultCallback = null) { List <Task> taskList = null; // ReSharper disable once ForCanBeConvertedToForeach for (int i = 0; i < _eventHandlerList.Count; i++) { // ReSharper disable once InconsistentlySynchronizedField EventHandlerHolder record = _eventHandlerList[i]; if (eventObject == null || record.ParameterType.IsInstanceOfType(eventObject)) { Task task = Task.Run(() => { this.OnMessageReceieved(record); var isVoid = record.MethodInfo.ReturnType == typeof(void); try { var result = record.MethodInfo.Invoke(record.Handler, new[] { eventObject }); resultCallback?.Invoke(isVoid, null, result, record.MethodInfo.ReturnType); } catch (Exception ex) { this._logger.LogError(ex.Message + Environment.NewLine + ex.StackTrace); resultCallback?.Invoke(isVoid, ex, null, record.MethodInfo.ReturnType); } }); if (taskList == null) { taskList = new List <Task>(); } taskList.Add(task); //record.MethodInfo.Invoke(record.Handler, new[] { eventObject }); } } if (taskList != null) { Task.WaitAll(taskList.ToArray()); } else { resultCallback?.Invoke(false, null, null, null); } }
protected void DispatchMessage(object eventObject) { try { // ReSharper disable once ForCanBeConvertedToForeach for (int i = 0; i < _eventHandlerList.Count; i++) { // ReSharper disable once InconsistentlySynchronizedField EventHandlerHolder record = _eventHandlerList[i]; if (eventObject == null || record.ParameterType.IsInstanceOfType(eventObject)) { Task.Run(() => { try { this.OnMessageReceieved(record); record.MethodInfo.Invoke(record.Handler, new[] { eventObject }); } catch (Exception ie) { this._logger.LogWarning("Event handler (class '{0}@{1}', method '{2}') failed: {3}{4}{5}{4}eventObject: {6}", record.Handler.GetType(), record.Handler.GetHashCode(), record.MethodInfo, ie.Message, Environment.NewLine, ie.StackTrace, eventObject); } }); } } } catch (Exception de) { this._logger.LogError("Dispatch event ({0}) failed: {1}{2}{3}", eventObject, de.Message, Environment.NewLine, de.StackTrace); } finally { Interlocked.Decrement(ref _pendingEventNumber); } }
protected virtual void OnMessageReceieved(EventHandlerHolder handler) { this.MessageReceieved?.Invoke(this, handler); }