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

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

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

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

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

textual
Листинг программы
  1.         public bool startNetServer()
  2.         {
  3.             try
  4.             {
  5.                 connections = new List<Tconnection>();
  6.                 IPAddress ip = new IPAddress(new byte[] { 0, 0, 0, 0 }); // тут всё привычно - создание слушателя
  7.                 listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  8.                 ep = new IPEndPoint(ip, VikingConfig.TCPport);
  9.                 listener.Bind(ep);
  10.                 listener.Listen(1000);
  11.                 waitAccept(); // в этом методе говорю - надо слушать
  12.                 outLog("Net server start", VikingServer.logLevel.WARNING);
  13.                 return true;
  14.             }
  15.             catch (Exception ex)
  16.             {
  17.                 outLog("Error of starting net server\r\n" + ex.ToString(), VikingServer.logLevel.ERROR);
  18.                 return false;
  19.             }
  20.         }
  21.  
  22.         void waitAccept()
  23.         {
  24.             try
  25.             {
  26.                 listener.BeginAccept(acceptCallBack, listener); // асинхронный метод ожидания подключений, передаём в метод делегат и ссылку на сокет-слушатель
  27.             }
  28.             catch (Exception ex)
  29.             {
  30.                 outLog(ex.ToString() + "\r\nListen is closed", VikingServer.logLevel.ERROR);
  31.             }
  32.         }
  33.  
  34.         void acceptCallBack(IAsyncResult ar) // новое подключение - вызывается этот метод
  35.         {
  36.             Tconnection newConnection;
  37.             try
  38.             {
  39.                 Socket s = (Socket)ar.AsyncState;  // получаем сокет-слушатель
  40.                 Socket newSocket = s.EndAccept(ar); // получаем сокет нового подключения, завершая операцию ожидания подключений
  41.                 newConnection = new Tconnection(newSocket); // это мой код
  42.                 newConnection.IP = ((IPEndPoint)newSocket.RemoteEndPoint).Address.ToString();
  43.                 outLog("Found new connection from " + newConnection.IP, VikingServer.logLevel.WARNING);
  44.                 newConnection.Port = ((IPEndPoint)newSocket.RemoteEndPoint).Port;              
  45.                 newConnection.ID = 0;
  46.                 newConnection.ConnectTime = DateTime.Now;
  47.                 newConnection.Status = connectionStatus.ON;
  48.                 newConnection.InDataEvent += NewConnection_InDataEvent;
  49.                 newConnection.OutDataEvent += NewConnection_OutDataEvent;
  50.                 newConnection.outLog += NewConnection_outLog;
  51.                 newConnection.TimerElapsed += NewConnection_TimerElapsed;
  52.                 if (newConnection.BeginListen()) // начинаю слушать - что же новый клиент имеет мне сказать
  53.                     WaitingList.Add(newConnection);
  54.                 waitAccept(); // не забываю опять ставить на прослушку сокет-слушатель
  55.             }
  56.             catch (SocketException ex)
  57.             {
  58.                 if (ex.SocketErrorCode == SocketError.ConnectionReset)
  59.                 {
  60.                     waitAccept();
  61.                     return;
  62.                 }
  63.                 outLog(ex.ToString() + "ErrCode: " + ex.SocketErrorCode.ToString(), VikingServer.logLevel.ERROR);  
  64.                 waitAccept();
  65.             }
  66.             catch (Exception ex)
  67.             {
  68.                 outLog(ex.ToString(), VikingServer.logLevel.ERROR);
  69.                 waitAccept();
  70.             }
  71.         }
  72.  
  73.         public bool BeginListen()
  74.         {
  75.             try
  76.             {
  77.                 _sock.BeginReceive(InData, 0, 1500, SocketFlags.None, ReceiveCallBack, _sock); // начинаю в пуле потоков ждать данных от нового клиента, когда данные будут получены - будет вызван делегат ReceiveCallBack
  78.                 return true;
  79.             }
  80.             catch (Exception ex)
  81.             {
  82.                 if (outLog != null)
  83.                     outLog("Listen data error:\r\n" + ex.ToString(), VikingServer.logLevel.ERROR);
  84.                 return false;
  85.             }
  86.         }

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


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

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

8   голосов , оценка 3.375 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы