示例#1
0
        public async Task OccupyRoom(OccupyRequest request)
        {
            var room = await UnitOfWork.GetDbSet <ProjectAccommodation>()
                       .Include(r => r.Inhabitants)
                       .Include(r => r.ProjectAccommodationType)
                       .Where(r => r.ProjectId == request.ProjectId && r.Id == request.RoomId)
                       .FirstOrDefaultAsync();

            var accommodationRequests = await UnitOfWork.GetDbSet <AccommodationRequest>()
                                        .Include(r => r.Subjects.Select(s => s.Player))
                                        .Include(r => r.Project)
                                        .Where(r => r.ProjectId == request.ProjectId && request.AccommodationRequestIds.Contains(r.Id))
                                        .ToListAsync();

            room.Project.RequestMasterAccess(CurrentUserId, acl => acl.CanSetPlayersAccommodations);

            foreach (var accommodationRequest in accommodationRequests)
            {
                var freeSpace = room.GetRoomFreeSpace();

                if (freeSpace < accommodationRequest.Subjects.Count)
                {
                    throw new JoinRpgInsufficientRoomSpaceException(room);
                }

                accommodationRequest.AccommodationId = room.Id;
                accommodationRequest.Accommodation   = room;
            }


            await UnitOfWork.SaveChangesAsync();

            await EmailService.Email(await CreateRoomEmail <OccupyRoomEmail>(room, accommodationRequests.SelectMany(ar => ar.Subjects).ToArray()));
        }
        public async Task <OccupyResponse> OccupyAsync(OccupyRequest request)
        {
            var result = await _context.OccupyAsync(new OccupyInstance(this.GetActorId().GetGuidId(), request.PartitionId, request.ServiceInstanceName), _cancellation);

            //calculate a seed value to the nearest 100ms to stagger the due time of the different actors.
            //this prevents from all actors occupied within milliseconds of each other from all vacating at exactly the same time
            //which will cause a deadlock on the pool actor.
            var expirationQuanta = await _repository.GetExpirationQuantaAsync(_cancellation);

            var intervalMs = (int)Math.Round(expirationQuanta.TotalMilliseconds / 5);
            var dueMs      = ((int)Math.Round((GetInstanceId().GetHashCode() % 1000) / 100.0) * 100) + intervalMs;

            await RegisterReminderAsync("expiration-quanta", null, TimeSpan.FromMilliseconds(dueMs), TimeSpan.FromMilliseconds(intervalMs));

            return(new OccupyResponse(result.ServiceName));
        }
 public Task <OccupyResponse> OccupyAsync(Guid instanceId, OccupyRequest request) =>
 GetProxy(instanceId).OccupyAsync(request);