Потоки, глобальные переменные и обмен данными между ними - 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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д