public GroupObserver(GroupObserverOptions groupObserverOptions)
        {
            if (groupObserverOptions == null)
            {
                throw new ArgumentNullException(nameof(groupObserverOptions));
            }

            _cancellationToken = _cancellationTokenSource.Token;
            groupObserverOptions.Build();
            GroupOptions = groupObserverOptions.GroupOptions;
            GroupMembersProvider = groupObserverOptions.GroupMembersProvider;
            GroupMemberStore = groupObserverOptions.GroupMemberStore;
            ObserverSchedule = groupObserverOptions.ObserverSchedule;

            if (groupObserverOptions.Events != null)
            {
                Events = new GroupObserverEvents
                {
                    OnGroupMembersJoined = groupObserverOptions.Events.OnGroupMembersJoined,
                    OnGroupMembersLeft = groupObserverOptions.Events.OnGroupMembersLeft,
                    OnGroupObserverStatusChanged = groupObserverOptions.Events.OnGroupObserverStatusChanged,
                    OnErrorOccured = groupObserverOptions.Events.OnErrorOccured
                };
            }
        }
        public GroupObserverOptions SetEventHandlers(Func<IEnumerable<GroupMember>, Task> onGroupMembersJoinedHandler = null, 
            Func<IEnumerable<GroupMember>, Task> onGroupMembersLeftHandler = null,
            Func<GroupObserverStatus, Task> onGroupObserverStatusChangedHandler = null,
            Func<Exception, Task> onErrorOccuredHandler = null)
        {
            Events = new GroupObserverEvents();

            if (onGroupMembersJoinedHandler != null)
            {
                Events.OnGroupMembersJoined = onGroupMembersJoinedHandler;
            }
            if (onGroupMembersLeftHandler != null)
            {
                Events.OnGroupMembersLeft = onGroupMembersLeftHandler;
            }
            if (onGroupObserverStatusChangedHandler != null)
            {
                Events.OnGroupObserverStatusChanged = onGroupObserverStatusChangedHandler;
            }
            if (onErrorOccuredHandler != null)
            {
                Events.OnErrorOccured = onErrorOccuredHandler;
            }

            return this;
        }