using Microsoft.AspNetCore.SignalR.Client;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace SignalRStressTester
private static int _numUsers = 100;
private static int _connectDelayMs = 100;
private static int _bettingIntervalMs = 1000;
private static int _cashoutIntervalMs = 5000;
private static string _hubUrl = "YOUR_SIGNALR_HUB_URL";
private static readonly Random _random = new Random();
static async Task Main(string[] args)
Console.WriteLine("SignalR Stress Tester");
Console.WriteLine($"Configured for {_numUsers} users, connect delay {_connectDelayMs} ms, betting interval {_bettingIntervalMs} ms, cashout interval {_cashoutIntervalMs} ms");
Console.WriteLine("Press any key to start...");
var tasks = new List<Task>();
for (int i = 0; i < _numUsers; i++)
tasks.Add(RunUserSimulator(i));
await Task.WhenAll(tasks);
Console.WriteLine("Stress test finished.");
static async Task RunUserSimulator(int userId)
var connection = new HubConnectionBuilder()
connection.On<string, Guid, double, double, decimal, bool>("broadcastMessage", (userHash,transactionId, wager, payout, multiplier,HasCashedOut) =>
Console.WriteLine($"User {userId} received broadcast: UserHash {userHash}, Transaction Id: {transactionId}, Wager: {wager}, Payout: {payout}, Mutliplier: {multiplier}, Has Cashed Out: {HasCashedOut}");
await connection.StartAsync();
Console.WriteLine($"User {userId} connected to hub");
Console.WriteLine($"User {userId} failed to connect attempting again : {ex.Message}");
await Task.Delay(_connectDelayMs);
await ConnectUser(connection,userId);
await PlaceBets(connection, userId);
await Task.Delay(_bettingIntervalMs);
await CashOut(connection,userId);
await Task.Delay(_cashoutIntervalMs);
Console.WriteLine($"User {userId} encountered an error: {ex.Message}");
await connection.StopAsync();
Console.WriteLine($"User {userId} Disconnected");
static async Task ConnectUser(HubConnection connection, int userId)
Token = Guid.NewGuid().ToString(),
OperatorId = Guid.NewGuid(),
Console.WriteLine($"User {userId} Connecting User {JsonConvert.SerializeObject(connectParams)}");
await connection.SendAsync("ConnectUser", connectParams);
static async Task PlaceBets(HubConnection connection, int userId)
AutoCashoutMultiplier = 2.0m,
var placeBetsParams = new
Token = Guid.NewGuid().ToString(),
OperatorId = Guid.NewGuid(),
Console.WriteLine($"User {userId} Placing Bets {JsonConvert.SerializeObject(placeBetsParams)}");
await connection.SendAsync("PlaceBets", placeBetsParams);
static async Task CashOut(HubConnection connection, int userId)
Token = Guid.NewGuid().ToString(),
OperatorId = Guid.NewGuid(),
Console.WriteLine($"User {userId} Casting Out {JsonConvert.SerializeObject(cashOutParams)}");
await connection.SendAsync("CastOut", cashOutParams);