Потоки, глобальные переменные и обмен данными между ними - C#

Узнай цену своей работы

Формулировка задачи:

Имеется два потока (А и Б) которые каждую минуту генерируют число. Также имеются две переменные (int iA, iB) и в эти переменные вышеуказанные потоки записавыют свои числа. Как мне их объявит данный переменные iA, iB так чтобы оба потока могли сохранить в них свои значения. Всё это надо чтобы третий поток по таймеру считывал с переменных значение и в форму выводил среднее значение. П.С. Вопрос сформулирован расплывчато но мне надо разобраться как правильно обмениваться информацией между потоками не сползаю invoke.

Решение задачи: «Потоки, глобальные переменные и обмен данными между ними»

textual
Листинг программы
        public bool startNetServer()
        {
            try
            {
                connections = new List<Tconnection>();
                IPAddress ip = new IPAddress(new byte[] { 0, 0, 0, 0 }); // тут всё привычно - создание слушателя
                listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                ep = new IPEndPoint(ip, VikingConfig.TCPport);
                listener.Bind(ep);
                listener.Listen(1000);
                waitAccept(); // в этом методе говорю - надо слушать
                outLog("Net server start", VikingServer.logLevel.WARNING);
                return true;
            }
            catch (Exception ex)
            {
                outLog("Error of starting net server\r\n" + ex.ToString(), VikingServer.logLevel.ERROR);
                return false;
            }
        }
 
        void waitAccept()
        {
            try
            {
                listener.BeginAccept(acceptCallBack, listener); // асинхронный метод ожидания подключений, передаём в метод делегат и ссылку на сокет-слушатель
            }
            catch (Exception ex)
            {
                outLog(ex.ToString() + "\r\nListen is closed", VikingServer.logLevel.ERROR);
            }
        }
 
        void acceptCallBack(IAsyncResult ar) // новое подключение - вызывается этот метод
        {
            Tconnection newConnection;
            try
            {
                Socket s = (Socket)ar.AsyncState;  // получаем сокет-слушатель
                Socket newSocket = s.EndAccept(ar); // получаем сокет нового подключения, завершая операцию ожидания подключений
                newConnection = new Tconnection(newSocket); // это мой код
                newConnection.IP = ((IPEndPoint)newSocket.RemoteEndPoint).Address.ToString();
                outLog("Found new connection from " + newConnection.IP, VikingServer.logLevel.WARNING);
                newConnection.Port = ((IPEndPoint)newSocket.RemoteEndPoint).Port;              
                newConnection.ID = 0;
                newConnection.ConnectTime = DateTime.Now;
                newConnection.Status = connectionStatus.ON;
                newConnection.InDataEvent += NewConnection_InDataEvent;
                newConnection.OutDataEvent += NewConnection_OutDataEvent;
                newConnection.outLog += NewConnection_outLog;
                newConnection.TimerElapsed += NewConnection_TimerElapsed;
                if (newConnection.BeginListen()) // начинаю слушать - что же новый клиент имеет мне сказать
                    WaitingList.Add(newConnection);
                waitAccept(); // не забываю опять ставить на прослушку сокет-слушатель
            }
            catch (SocketException ex)
            {
                if (ex.SocketErrorCode == SocketError.ConnectionReset)
                {
                    waitAccept();
                    return;
                }
                outLog(ex.ToString() + "ErrCode: " + ex.SocketErrorCode.ToString(), VikingServer.logLevel.ERROR);  
                waitAccept();
            }
            catch (Exception ex)
            {
                outLog(ex.ToString(), VikingServer.logLevel.ERROR);
                waitAccept();
            }
        }
 
        public bool BeginListen()
        {
            try
            {
                _sock.BeginReceive(InData, 0, 1500, SocketFlags.None, ReceiveCallBack, _sock); // начинаю в пуле потоков ждать данных от нового клиента, когда данные будут получены - будет вызван делегат ReceiveCallBack
                return true;
            }
            catch (Exception ex)
            {
                if (outLog != null)
                    outLog("Listen data error:\r\n" + ex.ToString(), VikingServer.logLevel.ERROR);
                return false;
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.375 из 5
Похожие ответы