Stavo provando a creare un test di integrazione per il mio servizio in cui 100 client si connettono, eseguono l'accesso, inviano richieste e registrano tutte le risposte per un certo periodo di tempo configurabile.
Sono stato creato una classe per il client usando socket asincroni e funziona perfettamente. Li ho avviati tutti utilizzando Task e Task.Factory, inviato il login e inviato ricevuto ogni volta che ho ricevuto i dati, fino al tempo scaduto e poi ho chiamato shutdown su di essi.
Sembra che non siano mai stati realmente eseguiti in parallelo. A volte potrei ottenere una corsa in una volta, a volte un po 'di più. Presumo che l'utilità di pianificazione li stia eseguendo quando sembra in forma piuttosto che tutti in una volta.
Ora capisco che non posso veramente avere 100 thread in esecuzione simultanea, ma voglio garantire che tutti i 100 siano avviati e che il sistema operativo stia cambiando il contesto e tenti di eseguirli tutti.
Alla fine, voglio simulare un gran numero di client connessi al mio servizio ricevendo tutti un flusso di dati.
Quale costrutto devo usare se Task non funziona?
Tentativo corrente:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IntegrationTests
{
class Program
{
static void Main(string[] args)
{
string server = ConfigurationManager.AppSettings["server"];
int port = int.Parse(ConfigurationManager.AppSettings["port"]);
int numClients = int.Parse(ConfigurationManager.AppSettings["numberOfClients"]);
TimeSpan clientLifetime = TimeSpan.Parse(ConfigurationManager.AppSettings["clientLifetime"]);
TimeSpan timeout = TimeSpan.Parse(ConfigurationManager.AppSettings["timeout"]);
TimeSpan reconnectInterval = TimeSpan.Parse(ConfigurationManager.AppSettings["reconnectInterval"]);
List<string> clientIds = ConfigurationManager.GetSection("clientIds") as List<string>;
try
{
// SNIP configure logging
// Create the specified number of clients, to carry out test operations, each on their own threads
Task[] tasks = new Task[numClients];
for(int count = 0; count < numClients; ++count)
{
var index = count;
tasks[count] = Task.Factory.StartNew(() =>
{
try
{
// Reuse client Ids, if there are more clients then clientIds.
// Keep in mind that tasks are not necessarily started in the order they were created in this loop.
// We may see client id 1 be assigned client id 2 if another client was started before it, but we
// are using all clientIds
string clientId = null;
if (numClients < clientIds.Count)
{
clientId = clientIds[index];
}
else
{
clientId = clientIds[index % clientIds.Count];
}
// Create the actual client
Client client = new Client(server, port, clientId, timeout, reconnectInterval);
client.Startup();
// Will make an sync request issue a recv.
// Everytime we get a reponse, it will be logged and another recv will be posted.
// This will continue until shutdown is called
client.MakeRequest(symbol);
System.Threading.Thread.Sleep(clientLifetime);
client.Shutdown();
}
catch(Exception e)
{
// SNIP - Log it
}
});
}
Task.WaitAll(tasks);
}
catch (Exception e)
{
// SNIP - Log it
}
}
}
}