Я создаю приложение чата и использую несколько потоков для одновременной работы с несколькими клиентами. Размер сервера увеличивается динамически. Я хочу, чтобы при этом текущие соединения становились ниже определенного числа, чтобы закрыть все ненужные потоки. Проблема в том, что мой делегат onClientDisconnected
вызывается в стороннем потоке, и, поскольку я хочу прервать некоторые потоки, включая тот, который был вызван invoke, он мгновенно закрывает поток, и не весь мой код выполняется. Итак, я спрашиваю вас сейчас, возможно ли вызвать моего делегата в стороннем потоке и каким-то образом выполнить его в моем основном потоке? Это мой код:
static void Main(string[] args)
{
Logger.LoadPreviousData();
baseColor = Console.ForegroundColor;
InitialiseServer();
currentMaxConnections = maxConnections;
onClientConnected += OnClientConnectedToServer;
onClientDisconnected += OnClientDisconnectedFromServer;
server.Start();
// Logging
Logger.WriteToLog(string.Format("Server initialised under {0}:{1} with a max connections of {2}" +
"\n--------------------------------------------------------"
,GetLocalIPAddressString(),serverPort,maxConnections));
// Here are created the client threads
for(int i = 1; i <= maxConnections; i++)
{
Thread currentThread = new Thread( () => ListenThread() );
currentThread.Start();
connectionThreads.Add(currentThread);
}
}
static void OnClientDisconnectedFromServer()
{
if(currentConnections <= currentMaxConnections - connectionsToAdd -2)
{
for(int i = 0; i < connectionsToAdd; i++)
{
connectionThreads.Last().Abort(); // From here , everything after does not get executed
connectionThreads.Remove(connectionThreads.Last());
}
currentMaxConnections -= connectionsToAdd;
string log = string.Format("[!] Server connection size decreased from {0} to {1}",currentMaxConnections + connectionsToAdd,currentMaxConnections);
Console.WriteLine(log);
Logger.WriteToLog(log);
}
}
// This is the side's thread function
public static void ListenThread()
{
// Some irelevant code for this topic was before this
try
{
while ((i = stream.Read(buffer, 0, bufferSize)) != 0)
{
data = Encoding.ASCII.GetString(buffer, 0, i);
data = ProcessData(data);
if (data == "/disconnect")
{
clients.Remove(currentClientConnection);
currentConnections--;
// Logging
string text = "A user left the server ! Connections : " + currentConnections;
Console.WriteLine(text);
Logger.WriteToLog(text);
SendToAllClients(string.Format("[Server]>> A user left the chat!"), client);
client.Close();
stream.Close();
client = null;
//**-----------------------------------------------------------------------
onClientDisconnected.Invoke();
//**-----------------------------------------------------------------------
break;
}
else
{
SendToAllClients(data, client);
}
}
}
catch { };
}
}