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