Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24

Обращение к данным которые формируются внутри Task

20.03.2015, 16:08. Показов 975. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

По мотивам парсера udp из этой темы Преобразование байтового сообщения из UDP
Если работа с одним потоком понятна и проста, то как работать в случае с несколькими потоками?

У меня есть класс, в который организует подключение, получение байтов на основе передаваемых параметров:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public class Interface
    {
        UdpClient _client;
        IPAddress _multiIp;
        IPEndPoint _localIp;
        public Byte[] bytes;
 
        public Interface(string IpArg, int PortArg)
        {
            _client = new UdpClient();
            _localIp = new IPEndPoint(IPAddress.Any, PortArg);
            _client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            _client.ExclusiveAddressUse = false;
            _client.Client.Bind(_localIp);
            Debug.WriteLine(_localIp);
            _multiIp = IPAddress.Parse(IpArg);
            _client.JoinMulticastGroup(_multiIp);
            while (true)
            {
                bytes = _client.Receive(ref _localIp);
            }
        }
    }
Есть инициализатор по типу
C#
1
2
3
4
            Task task1 = new Task(() =>
            {
                Interface udp1 = new Interface(conf_ip, conf_port);
            });
Все запускается и работает, но я не знаю как обратиться к байтам которые получает интерфейс, как я могу это сделать?
И еще вопрос, как правильнее было бы организовывать несколько подключений имея класс интерфейса?
Используя Task или более верные варианты?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2015, 16:08
Ответы с готовыми решениями:

Task.Wait() внутри foreach
Добрых времени суток. Есть 2 вложенных foreach'a, внутри последнего необходимо выполнить асинхронную задачу. int sended = 0; ...

Вывести вещественные числа двумерного массива которые формируются случайно
Мне нужно вывести вещественные числа двумерного массива которые рандомно формируются...если кто знает как сделать это красиво, чтобы было в...

Таймер и параллельное обращение к данным
Есть таймер, который срабатывает каждые 10 миллисекунд. Он вызывает метод А, который зачитывает данные из словаря D. Есть метод B, который...

4
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
20.03.2015, 16:51
Вам нужно объявить событие в интерфейсе и при получении байтов файрить его.
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
 public class Interface
    {
        public event EventHandler<NetInterfaceEventArgs> BytesReceived;
        //... 
 
 
public Interface(string IpArg, int PortArg)
        {
            _client = new UdpClient();
            _localIp = new IPEndPoint(IPAddress.Any, PortArg);
            _client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            _client.ExclusiveAddressUse = false;
            _client.Client.Bind(_localIp);
            Debug.WriteLine(_localIp);
            _multiIp = IPAddress.Parse(IpArg);
            _client.JoinMulticastGroup(_multiIp);
            while (true)
            {
                bytes = _client.Receive(ref _localIp);
                 if (bytes>0)
                   if (BytesReceived!=null)
                        BytesReceived(this, new NetInterfaceEventArgs(bytes));
            }
        }
 
    }
 
    public class NetInterfaceEventArgs : EventArgs
    {
        public byte[] Data { get; private set; }
 
        public NetInterfaceEventArgs(byte[] data)
        {
            Data = data;
        }
    }
Ну и подписка:
C#
1
2
3
4
5
Task task1 = new Task(() =>
            {
                Interface udp1 = new Interface(conf_ip, conf_port);
                udp1.BytesReceived += YourMethodName;
            });
Добавлено через 3 минуты
И да, было бы логичнее начало прослушки порта выделить в отдельный метод. И только потом подписываться. - Смотрите, как реализованы объекты для работы с сетью в FCL.
1
48 / 48 / 10
Регистрация: 22.02.2012
Сообщений: 137
20.03.2015, 17:20
Цитата Сообщение от creonz Посмотреть сообщение
Все запускается и работает, но я не знаю как обратиться к байтам которые получает интерфейс, как я могу это сделать?
Возможные "простые в реализации" варианты:
1) Контролируемый доступ к общим ресурсам (выгрузка в файл или в какой-то массив (возможно static) + lock/Monitor/...)
2) TCP-соединение на основе TcpClient+TcpListener
3) Доступный метод в классе, запускающем Task (GetBytesFromInterface(byte[] data))
4) Подписка (описано в сообщении выше)

Цитата Сообщение от creonz Посмотреть сообщение
И еще вопрос, как правильнее было бы организовывать несколько подключений имея класс интерфейса?
А почему бы и не Task? Так же подумайте, как нужно идентифицировать интерфейсы (ведь вам вряд ли нужно все байты смешивать в одну кучу)

Цитата Сообщение от creonz Посмотреть сообщение
Используя Task или более верные варианты?
Мне нравится Task. Он толково регулирует нагрузку + корректно работает с потоками (если не ошибаюсь, отдельный поток на Task создается не всегда).
1
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
25.03.2015, 18:20  [ТС]
Добрый день, изучив пример и документацию реализовал следующим способом. Возможно полная отсебятина, поэтому извиняюсь. Я только изучаю шарп
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
    public class UdpListener
    {
        #region Properties
        private UdpClient _client;
        private IPAddress _multiIp;
        private IPEndPoint _localIp;
        private Thread _listenerThread;
        private readonly Action<byte[]> bytesReceive;
        private string IpArg;
        private int PortArg;
        #endregion
 
        public UdpListener(Action<byte[]> bytesReceive)
        {
            this.bytesReceive = bytesReceive;
            StartListener();
        }
 
        public void StartListener()
        {
            _client = new UdpClient();
            _localIp = new IPEndPoint(IPAddress.Any, PortArg);
            _client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            _client.ExclusiveAddressUse = false;
            _client.Client.Bind(_localIp);
            Debug.WriteLine(IpArg + ":" + PortArg);
            _multiIp = IPAddress.Parse(IpArg);
            _listenerThread = new Thread(() =>
            {
                _client.JoinMulticastGroup(_multiIp);
                while (true)
                {
                    try
                    {
                        Byte[] bytes = _client.Receive(ref _localIp);
                        if (bytes !=null && bytes.Length !=0)
                        {
                            bytesReceive(bytes);
                        }
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine("Exception in UDP listening: " + e.ToString());
                    }
                }
            });
            _listenerThread.Start();
        }
 
        public void StopListener()
        {
            _client.Close();
            _listenerThread.Join();
        }
    }
И Инициализация:
C#
1
2
3
4
5
UdpListener udp = new UdpListener((o) => ProcessUdpObject(o));
private void ProcessUdpObject(byte[] o)
        {
            Debug.WriteLine("UDP in: " + BitConverter.ToString(o));
        }
Байты получаю, но насколько правильно я подошел к реализации? И при такой реализации я не могу понять как мне передавать параметры для Udp подключения(порт и адресс, как в первом варианте)
1
48 / 48 / 10
Регистрация: 22.02.2012
Сообщений: 137
26.03.2015, 11:29
Как по мне - так уж лучше сделать метод "получить данные от листенера, если они есть". При Получении байт - класть их в буфер, при вызове метода - очищать. Соответственно с использованием lock.
А передавать параметры можно или в конструкторе (если менять их не собираетесь)

C#
1
2
3
4
5
6
7
public UdpListener(Action<byte[]> bytesReceive, string ipAddress, int port)
{
            this.bytesReceive = bytesReceive;
            IpArg = ipAddress;
            PortArg = port;
            StartListener();
}
Добавлено через 27 минут
Цитата Сообщение от FesS92 Посмотреть сообщение
Как по мне - так уж лучше сделать метод "получить данные от листенера, если они есть". При Получении байт - класть их в буфер, при вызове метода - очищать. Соответственно с использованием lock.
Я передумал. Ваша реализация лучше)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2015, 11:29
Помогаю со студенческими работами здесь

Обращение к данным из XML-файла
У меня есть рядом с экзешником программы XML-файл. В нем хранится буллева переменная. Так вот, мне надо из кода проверить тру она или фалс....

Просмотр формул, которые формируются в отчете
Здравствуйте. Сделав ранее таблицу расчета з/п в Ексель - было все понятно. Теперь решил сделать зп в Access. Скачал тестовую базу, в...

[мк51] Оценить частоту импульсов, которые формируются на линии порта при выполнении программы
Добрый день. Подскажите можно ли реализовать это в программе EMU8086 (может другой)? Или это все нужно считать в &quot;ручную&quot;. ...

Вычислить сумму индексов положительных элементов массива С(9) которые формируются по правилу: C(i)=Sin(C(i-1) + 2) где С(1)=13
Составить блок-схему. Буду признательно.

Обращение к данным класса.
Доброе время суток. Начал самостоятельно изучать классы. Хотел выполнить задание, но возникла первая трудность. #include...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru