public async Task WritePixel(WritePixelCommand command) { if (await IsRateLimited() || await IsBlacklisted()) { //throttle user await Task.Delay(TimeSpan.FromSeconds(RateLimitedRequests)); return; } var slice = GrainFactory.GetGrain <IPixelSliceGrain>(command.SliceKey); await slice.WritePixel(command); LastWrite = DateTime.UtcNow; }
public Task WritePixel(WritePixelCommand command) { var index = SliceHelpers.GetIndex(command.X, command.Y); var relativeIndex = index - Offset; var pixel = _slice.Pixels[relativeIndex]; //only replace pixel if new command is newer. if (command.Timestamp >= pixel.LastTimestamp || !pixel.LastTimestamp.HasValue) { pixel.Color = command.Color; pixel.LastAuthor = command.Author; pixel.LastTimestamp = command.Timestamp; } return(TaskDone.Done); }
private static Task RunBatch(int count, Random random) { List <Task> tasks = new List <Task>(); var i = count; while (i-- > 0) { var userid = random.Next() % 10; var x = random.Next() % Constants.Width; var y = random.Next() % Constants.Height; var color = (Colors)(random.Next() % 256); string username = $"TestClient_{userid}"; var author = GrainClient.GrainFactory.GetGrain <IUserGrain>(username); var command = new WritePixelCommand() { X = (short)x, Y = (short)y, Author = username, Color = color, Timestamp = DateTime.UtcNow }; //await author.WritePixel(command); tasks.Add(author.WritePixel(command)); //Console.WriteLine($"{username} wrote pixel {x}x{y} with {color.ToString()}"); } Task.WaitAll(tasks.ToArray()); return(TaskDone.Done); }