public bool TryAdd(ulong key, StarboardSource value)
 {
     try
     {
         _lock.EnterWriteLock();
         return(Dictionary.TryAdd(key, value));
     }
     finally
     {
         _lock.ExitWriteLock();
     }
 }
        public bool AddOrUpdate(ulong key, StarboardSource addValue, StarboardSource updateValue)
        {
            try
            {
                _lock.EnterWriteLock();
                if (!Dictionary.TryAdd(key, addValue))
                {
                    Dictionary[key] = updateValue;
                    return(false);
                }

                return(true);
            }
            finally
            {
                _lock.ExitWriteLock();
            }
        }
        public void Remove(ulong key, StarboardSource value)
        {
            try
            {
                _lock.EnterUpgradeableReadLock();

                if (Dictionary.ContainsKey(key) && Dictionary[key] == value)
                {
                    try
                    {
                        _lock.EnterReadLock();
                        Dictionary.Remove(key);
                    }
                    finally
                    {
                        _lock.ExitReadLock();
                    }
                }
            }
            finally
            {
                _lock.ExitUpgradeableReadLock();
            }
        }
 private static async Task UpdateStarsGivenInternalAsync(StarboardContext context, StarboardSource source, IAsyncEnumerable <IReadOnlyCollection <IUser> > starGivingUsers)
 {
     await starGivingUsers.ForEachAsync(async users =>
     {
         foreach (IUser user in users)
         {
             if (user.Id != context.StarredMessage.Author.Id)
             {
                 if (!context.MessageData.StarGivingUsers.AddOrUpdate(user.Id, source, StarboardSource.STARRED_MESSAGE))
                 {
                     await context.RemoveReactionFromStarboardMessageAsync(user);
                 }
             }
             else
             {
                 await context.RemoveReactionAsync(user, source);
             }
         }
     });
 }