Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269

Проблема подписки события

04.04.2019, 10:48. Показов 2032. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что-то я совсем упоролся...
У меня есть класс Настройки, в котором я перезапускаю камеру по TCP службы Cognex
и подписываюсь на событие

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#region Камера
        private bool IsCameraRestarted(string ip, int port)
        {
            bool result = false;
 
            try
            {
                _parent._serverClient._cameraTcpClient.Host = ip;
                _parent._serverClient._cameraTcpClient.Port = port;
 
                _cameraHasChanged = true;
 
                string messageEcho = "";
 
                _parent._serverClient.ReceivedEcho += (s, a) => messageEcho = a.Message;
                Debug.Print("Результат события ReceivedEcho: "+ messageEcho);
 
 
                _parent._serverClient.RestartCamera();
 
                result = _parent._serverClient.CameraHasConnect == true;
 
                if (result)
                    _parent._log.Write("Удаленная служба камер переподключена.");
                else
                    _parent._log.Write("Ошибка переподключения к удаленной службе камер.");
            }
            catch (Exception ex)
            {
                _parent._log.Write("Ошибка переподключения к удаленной службе камер.", ex);
                result = false;
            }
            finally
            {
                CameraConnectState = _parent._serverClient.CameraHasConnect;
                _cameraRestarted = true;
            }
            return result;
        }
 
        #endregion
проблема в том, что в messageEcho ничего не приходит и я не могу использовать эту переменную в своих целях, я отправляю время и в ответ сервер отправляет мне время, мне надо убедиться, что пришло то, что я ему отправил.

обект internal ServerClient _serverClient; надодится в MainVM, где в классе ServerClient я реализую событие:

C#
1
2
3
4
5
6
7
8
9
10
11
12
....
public event EventHandler<ReceivedEchoEventArgs> ReceivedEcho;
 
void _camera_ReceivedEcho(object sender, EchoData e)
        {
            OnReceivedEcho(e);
        }
 
        private void OnReceivedEcho(EchoData result)
        {
            ReceivedEcho?.Invoke(this, new ReceivedEchoEventArgs(result.HasResp, result.Message));
        }
Теперь вернемся в класс настройки, у меня есть метод _parent._serverClient.RestartCamera();
Условно говоря вызывается метод Эхо в классе Камера
C#
1
2
3
4
5
public void Echo()
        {
            SetId();
            SendMessage("echo " + Id);
        }
Где в первом методе формируем время, а во втором методе отправляем запрос на сервер

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// отправка сообщений
        private void SendMessage(string command)
        {
            Start();
 
            _command = command;
 
            _message = "";
 
            if (_stream == null || HasConnect != true) return;
 
            byte[] data = Encoding.ASCII.GetBytes(command);
            _stream.Write(data, 0, data.Length);
        }
вызывает метод старт
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private void Start()
        {
            bool isNewClient = _client == null || _client.Client == null || !_client.Connected;
 
            if (isNewClient)
            {
                if (_client != null)
                {
                    Dispose();
                }
 
                _client = new TcpClient();
 
                try
                {
                    _cancellationTokenSource = new CancellationTokenSource();
                    _client.Connect(Host, Port);
                    _stream = _client.GetStream();
 
                    _receiveTask = Task.Run(() => ReceiveMessage(_cancellationTokenSource.Token), _cancellationTokenSource.Token);
                }
                catch (Exception ex)
                {
                    OnError("Ошибка запуска клиента камеры.", ex);
                }
                finally
                {
                    HasConnect = (_client != null && _client.Client != null) ? _client.Connected : false;
 
                    if (HasConnect == true)
                        OnConnect(isNewClient);
                }
            }
        }
Тут мы читаем ответ от сервера
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
private void ReceiveMessage(CancellationToken token)
        {
            try
            {
                while (!token.IsCancellationRequested)
                {
                    byte[] data = new byte[64]; // буфер для получаемых данных
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        if (token.IsCancellationRequested)
                            return;
                        try
                        {
                            bytes = _stream.Read(data, 0, data.Length);
                        }
                        catch (Exception ex)
                        {
                            if (token.IsCancellationRequested)
                                return;
 
                            throw ex;
                        }
 
                        builder.Append(Encoding.ASCII.GetString(data, 0, bytes));
                    }
                    while (_stream.DataAvailable && !token.IsCancellationRequested);
 
                    if (token.IsCancellationRequested)
                        return;
 
                    Debug.WriteLine(builder.ToString());
 
                    //проверка на ошибку перед добавлением в общее сообщение
                    if (string.IsNullOrWhiteSpace(builder.ToString()) ||
                        builder.ToString().Substring(0, 2).ToLower().Contains("er"))
                    {
                        OnError("Полученное от удаленной службы камер сообщение имело не верный формат.");
                    }
 
                    _message += builder.ToString();
 
                    if (_message.Contains((char)3))
                    {
                        _message = _message.Replace((char)3, ' ');
 
                        if (_imageConfig.LogMessages)
                        {
                            _log.Write(string.Format("Задание ID: {0}.\nДанные: {1}", _jobId, _message));
                        }
 
                        Debug.WriteLine(_message);
                        ParseMessage(_message);
                        _message = "";
                    }
                }
            }.....
здесь я распарсил
C#
1
2
3
4
5
6
7
8
9
10
11
private void ParseMessage(string message)
        {
 
            ..........
            else if (_command.Contains("echo"))
            {
                var result = ParseEcho(message);
                OnReceivedEcho(result);
                Debug.Print("Ответ из TcpClient Echo: " + result.Message);
            }
        }
OnReceivedEcho(result); - здесь всё прекрасно, в значении result то, что мне нужно () там 2 значения
Это всё в камере, в этом же классе я как в классе ServerClient реализовал событие , кроме _camera_ReceivedEcho

private void OnReceivedEcho(EchoData result)
{
ReceivedEcho?.Invoke(this, new ReceivedEchoEventArgs(result.HasResp, result.Message));
}
и в классе камера всё прекрасно ReceivedEcho?.Invoke(this, new ReceivedEchoEventArgs(result.HasResp, result.Message)); тут всё приходит то, что нужно , мне нужно значение result.Message в классе настройки..
Пожалуйста, не проходите мимо, скиньтесь мозгами, кто чем может))))

Добавлено через 22 минуты
В классе ServerClient
C#
1
2
3
4
private void OnReceivedEcho(EchoData result)
        {
            ReceivedEcho?.Invoke(this, new ReceivedEchoEventArgs(result.HasResp, result.Message));
        }
Тоже приходит при отправке от сервера то, что нужно, как вызвать это значение в классе Настройки?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2019, 10:48
Ответы с готовыми решениями:

Подписки на события
Доброго времени суток! Как это работает? Для чего это?

Подписки на события, интерактивная настройка
Есть видео https://www.youtube.com/watch?v=MTxrZAuBBio Хотелось бы узнать, как такое можно реализовать. Есть ли что-то подобное в...

Проблема с обработкой события
У меня следующая проблема. Я создал такой простенький PHP-сценарий который должен запращивать имя в форме и после нжатия на кномку OK...

27
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
04.04.2019, 11:40
1) Где вы используете переменную? только в Debug.Print?
2) Если на п.1 Ответ да, то там и будет пусто.
3) Для понятия лучше вынести действия после срабатывания события в отдельный метод, а не в синтаксический сахар.
4) как я помню при текущей реализации если сработает событие оно запишет то данный, но не более того, метод дальше не пойдёт выполняться.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
04.04.2019, 11:50  [ТС]
SeIZVeIZ, Да, после получения в классе Камера верного значения
C#
1
OnReceivedEcho(result);
Я его использую только в классе Настройки
C#
1
2
3
4
string messageEcho = "";
 
                _parent._serverClient.ReceivedEcho += (s, a) => messageEcho = a.Message;
                Debug.Print("Результат события ReceivedEcho: "+ messageEcho);
Я не очень понял, как можно вызвать этот результат в классе Настройки? Вы могли бы в коде показать?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
04.04.2019, 11:58
Лучший ответ Сообщение было отмечено ShmelVG как решение

Решение

Ну смотрите, вы подписываетесь на событие и тут же хотите уже данные от него, такого не бывает

для наглядности я и говорил сделать подписку стандартной т.е.:
C#
1
2
3
4
5
6
_parent._serverClient.ReceivedEcho += GetMessageEcho;
******
private void GetMessageEcho(object sender, EchoData e)
{
var messageEcho = e.Message;
}
и после этого посмотреть приходит ли событие уже вот так. И если приходит решать из этого вариант, а если нет, капать дальше и смотреть.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
04.04.2019, 12:21  [ТС]
SeIZVeIZ, пишет ошибка void GetMessageEcho(object sender, EchoData e), нет перегруженного метода для "GetMessageEcho" , который соответствует делегату EventHandler<ReceivedEchoEventArgs> , я пробовал изменить, но не получалось
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
04.04.2019, 12:33
ShmelVG, я писал как пример, я же не знаю какие надо именно типы данных
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
04.04.2019, 12:39  [ТС]
SeIZVeIZ, Да, спасибо) Но проблема пока так и не решена(
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
04.04.2019, 12:40
ShmelVG, походу вот так надо метод объявить: GetMessageEcho(object sender, ReceivedEchoEventArgs e)
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.04.2019, 10:53  [ТС]
SeIZVeIZ, попробовал, но он не даже не заходит в событие в настройках(
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
05.04.2019, 10:58
тогда нужно проверять точно ли именно _parent._serverClient генерирует событие о котором вы писали в 1 посте, видимо нет.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.04.2019, 11:20  [ТС]
SeIZVeIZ, я посмотрел в отладке
C#
1
2
3
4
private void OnReceivedEcho(EchoData result)
        {
            ReceivedEcho?.Invoke(this, new ReceivedEchoEventArgs(result.HasResp, result.Message));
        }
и обнаружил, что в ReceivedEcho = null, не понимаю почему, тут new ReceivedEchoEventArgs(result.HasResp, result.Message) всё ок

Добавлено через 5 минут
SeIZVeIZ, почему правая часть не записывает в ReceivedEcho?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
05.04.2019, 11:26
ShmelVG, у меня единственное предположение что вы смотрите 2 разных экземпляра класса и в 1 вы подписываетесь, а во 2 вы событие дёргаете.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.04.2019, 11:29  [ТС]
SeIZVeIZ, я из класса ServerClient убрал событие, т.к. оно всё равно вызывается из класса Камера....В общем, что-то я окончательно запутался(
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
05.04.2019, 11:30
ShmelVG, вы сам проект целиком показать можете?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.04.2019, 12:54  [ТС]
SeIZVeIZ, ответил в лс

Добавлено через 1 час 8 минут
Решено, спасибо SeIZVeIZ!!!
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.04.2019, 13:43
Камера onvif не поддерживает?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.04.2019, 14:14  [ТС]
Wolfdp,
Цитата Сообщение от Wolfdp Посмотреть сообщение
onvif
не очень понял, передача осуществляется по TCP протоколу
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.04.2019, 14:16
https://ru.wikipedia.org/wiki/ONVIF

или под "камерой" подразумевается нечто иное?
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.04.2019, 14:36  [ТС]
Wolfdp, да, я читал и не понял к чему это) Просто камера не то, что вы подразумеваете)

Добавлено через 16 минут
SeIZVeIZ, вы могли ещё подсказать, как можно использовать результат в классе SettingsStateVM я подписался
C#
1
2
 _parent._serverClient.ReceivedEcho += GetMessageEcho;
                Debug.Print("Результат события ReceivedEcho: " + messageEcho);
в этом же классе в переменную messageEcho приходит то, что надо
C#
1
2
3
4
5
6
7
8
9
private void GetMessageEcho(object sender, ReceivedEchoEventArgs e)
        {
            var messageEcho = e.Message;
        }
        
        internal void OnReceivedEcho(EchoData result)
        {
            ReceivedEcho?.Invoke(this, new ReceivedEchoEventArgs(result.HasResp, result.Message));
        }
но сюда уже больше не заходит
C#
1
Debug.Print("Результат события ReceivedEcho: " + messageEcho);
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
05.04.2019, 14:46
ShmelVG, если эти данные нужны только для Debug.Print добавьте этот вывод в метод события и всё:
C#
1
2
3
4
5
private void GetMessageEcho(object sender, ReceivedEchoEventArgs e)
        {
            var messageEcho = e.Message;
Debug.Print("Результат события ReceivedEcho: " + messageEcho);
        }
А если нужно именно в том методе, то там логику надо заново выстраивать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2019, 14:46
Помогаю со студенческими работами здесь

Проблема одновременно скрыть курсор и выйти из события
Приветствую. Понравилось скрыть курсор следующим кодом (только в пределах ChartArea) private void chart1_MouseMove(object sender,...

БД подписки!
Здравствуйте, друзья :) В общем, мне нужно сделать так, чтобы была форма добавления человека в базу данных, рядом выпадающий список в с...

Подписки
Всем привет, имею вот такую ошибку https://i.**********/2PRs9Vd.png И вот такой код: Вопрос: В чем проблема? Аккаунты резетив. Если...

Создание Подписки
Всем привет! Я хочу создать на своем блогу подписку,простую класическую подпсику не через e-mail,а чтобы user получал мои новости в...

Внутренние подписки
Доброго времени суток. У меня возникла проблема решил у себя сделать такую штуку на сайте: Хочу сделать на сайте рубрику с материалами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru