Вызов делегата из бокового потока и обработка основного потока. Является ли это возможным? - PullRequest
0 голосов
/ 04 марта 2020

Я создаю приложение чата и использую несколько потоков для одновременной работы с несколькими клиентами. Размер сервера увеличивается динамически. Я хочу, чтобы при этом текущие соединения становились ниже определенного числа, чтобы закрыть все ненужные потоки. Проблема в том, что мой делегат 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 { };
            }
        }
...