Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2021, 10:10   #1
Keytchup
Новичок
Джуниор
 
Регистрация: 25.10.2021
Сообщений: 1
Сообщение Приватное поле присваивается значение null.

Цитата:
Всем привет!

Есть программа на сервере в нем я получаю данные с оборудования(допустим бытовой счётчик электроэнергии) и отправляю её в другое конкретное устройство(на компьютер клиента приходит значения счётчика).
Но, допустим, у нас оборвалась связь между клиентом и сервером, и через рандомное время соединение восстановилось.
Тут то и проблема образовалась.
При восстановлении соединения, данные, которые отправлял сервер, не отображается на компьютере у клиента.
Ну, по сути это и верно, не было события, которое должно было отправить последнее значение счётчика при восстановлении соединения.
Код:
public abstract class TcpBridge : IDisposable
{
  private byte[] _data; //приватное поле для сохранения данных
  private async void _MakeConnection()
  {
    ChangeStateConnect(StateConnect.Connect); //при восстановлении соединения
    Task.Run(async () =>
    {
      try
      {
        byte[] buffer = new byte[512];
        while (!_canTokRec.IsCancellationRequested) //выполняется, до обрыва связи с устройством
        {
          var byteCount = await tcpClient.GetStream().ReadAsync(buffer, 0, buffer.Length, canTokRec.Token);
          var data = tcpDec.ReciviedPackage(buffer.Take(byteCount).ToArray());
          if (data.Length > 0)
          {
            NewPackReceivedSend?.Invoke(tcpDec, data);// событие, когда приходит данные со счётчика. если не приходит, то равен null и событие не срабатывает. 
                                                                               //Отправляется данные в случайное время, обычно специально отправляю когда клиент отключается, чтобы восстановить последнее текущее соединение.
                                                                               //допустим счётчик отправил последний раз строку 1456, когда связь была разорвана, но клиент не смог восстановить это значение, т.к. data=0 байт.
             if (NewPackReceivedSend != null) //здесь как раз пытаюсь отловить сигнал об изменении данных
             {
               _data = data; //допустим я тут сохраняю нужное значение локального переменного, чтобы сохранить значение счётчика. data может принять разные данные в один момент, поэтому приходится так делать.
                                    //данное условие выполняется и _data принимает значение 1456
             }
             else
             {
               OnChangeConnectStateSend?.Invoke(_data, tcpDec);//возникает событие, когда связь восстановилась после обрыва
               //здесь и хочу отправить новые данные, но _data=null, хотя _data была =1456.
               // _data используется только в этом классе и в этом методе, потому что можно предположить, что я
               // в коде мог занулять _data, но такого нет.
             }
          }
        }
      }
      catch(Exception e)
      {
        ChangeStateConnect(StateConnect.NoConnect);//метод оповещения об обрыве соединения
      }
    }, _canTokRec.Token);
  }
}
Данный абстрактный класс использует клиент и сервер. Клиента запускаю через скомпилированный exe.
Объясните мне, пожалуйста, почему _data сначала принимает нужное значение, но при восстановлении соединения становится =null.
Было бы хорошо если объясните, как всё-таки сохранить предыдущее значение счётчика.

Последний раз редактировалось Keytchup; 25.10.2021 в 11:26.
Keytchup вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Реклама для незарегистрированных, регистрация на форуме