Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Кактус
 Аватар для eocron
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342

Может кто нибудь объяснить асинхронность?

14.09.2013, 23:29. Показов 2542. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, как я не пытался понять, что на самом деле происходит при асинхронном вызове, так и не понял...
В частности не понял, как они работают с операциями считывания и записи - сжирают поток и ждут пока че-нибудь можно будет считать (и так простаивают пока кто-то не капнет сообщение), или же требуют процессорного времени только, когда что-то реально пришло.
Если второй вариант, то я совершенно не пойму откуда их запускать - например, есть 800 пользователей и все они когда-нибудь, что-нибудь да пришлют, а может и не пришлют, а делать пул потоков размера овер тыща и ждать чуда, или заводить поток в котором крутится бесконечный цикл проверки на сообщения от каждого - дорого, а куда пихать асинхронное считывание с них? В 800 циклов, которые работают в 800 потоках? Не понято ничего. В одном из буржуйских примеров вообще какая-то рекурсия была с этими вызовами....

Енглишь вроде понимаю кое-как, но разобраться не могу, а документация только там нормальная, серьезная, помогите....очень хочется понять, как ими пользоваться...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2013, 23:29
Ответы с готовыми решениями:

Может кто объяснить, что за дуплексная связь?
Библиотека общая для клиента и сервера: using System.ServiceModel; namespace ClassLibrary { public interface...

Работа с Excel C#. Кто может объяснить почему выскакивает исключение?
Не хочется открывать книгу Excel. Написано все вроде правильно. Материал брал отсюда. Исключение выскакивает когда пытаюсь открыть книгу...

Кто может объяснить что такое CLR?
Что вообще делает CLR? читала но как то не особо поняла:-|

2
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.09.2013, 13:13
Цитата Сообщение от eocron Посмотреть сообщение
как они работают с операциями считывания и записи - сжирают поток и ждут пока че-нибудь можно будет считать (и так простаивают пока кто-то не капнет сообщение), или же требуют процессорного времени только, когда что-то реально пришло.
Второе.
Асинхронный вызов работает на уровне системных прерываний, так что для ожидания отдельного потока не требуется.
Когда поступают данные, рантайм выделит для их обработки какой-нибудь поток из пула.

Через это 800 запросов могут вполне обработать десяток-полтора потоков, в зависимости от требуемого процессорного времени на обработку одного запроса.
1
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
15.09.2013, 14:20
Лучший ответ Сообщение было отмечено eocron как решение

Решение

Смотря как делать.
Нужно ли постоянное соединение с клиентом, или нет? Если нет, нужно всего лишь прослушивать порт для установки соединений. После установки соединения - обрабатывать запрос, создавая асинхронный вызов чтения данных. После обработки закрывать соединение.

Небольшой пример:
Кликните здесь для просмотра всего текста

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    class Program
    {
        static Socket Listener;
 
        class State
        {
            public State(Socket handler)
            {
                buffer = new byte[1024];
                data = new MemoryStream();
                this.handler = handler;
            }
 
            public byte[] buffer;
            public Socket handler;
            public MemoryStream data;
        }
 
        public static void Main(string[] args)
        {
            Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Listener.Bind(new IPEndPoint(IPAddress.Any, 9873));
            Listener.Listen(100);
            //вызываем первый асинхронный метод для принятия соединения
            //AcceptCallback - метод оповещающий что метод BeginAccept закончил свою работу.
            //и позволяющий обработать результат его работы.
            //Второй параметр нужен для передачи дополнительных данных в метод AcceptCallback
            Listener.BeginAccept(AcceptCallback, null);
        }
 
        private static void AcceptCallback(IAsyncResult ar)
        {
            //получаем сокет связанный с удаленной точкой
            Socket client = Listener.EndAccept(ar);
            //начинаем асинхронное принятие следующего подключения
            Listener.BeginAccept(AcceptCallback, null);
            //создаем объект хранящий данные о текущем подключении
            State clientState = new State(client);
            //начинаем асинхронный прием данных
            //первые три параметра данные о буфере в который будут сохранятся данные.
            //4 параметр доп. флаги
            //ReceiveCallback метод оповещающий о завершении работы этого метода.
            //последним параметром мы передаем данные о клиенте
            client.BeginReceive(clientState.buffer, 0, clientState.buffer.Length, SocketFlags.None, ReceiveCallback, clientState);
        }
 
        private static void ReceiveCallback(IAsyncResult ar)
        {
            //тут считываем данные и записываем их в data.
            //если считаны не все данные, то вызываем еще раз BeginReceive, для данного сокета.
            //если все, то закрываем соединение и начинаем обработку данных.
 
            //в начале получим данные о клиенте
            State clientState = (State)ar.AsyncState;
            //завершаем прием данных, получая при этом число считанных байт
            int ReadBytes = clientState.handler.EndReceive(ar);
 
            if (ReadBytes > 0)
            {
                //записываем данные в поток
                clientState.data.Write(clientState.buffer, 0, ReadBytes);
 
                if (/*если приняты все данные*/)
                {
                    //закрываем соединение
                    clientState.handler.Shutdown(SocketShutdown.Both);
                    clientState.handler.Dispose();
                    
                    //тут можно данные обработать (все данные будут в clientState.data)
 
                    clientState.data.Dispose();
                    return;
                }
            }
 
            //до этого метода дойдем если приняты не все данные
            clientState.handler.BeginReceive(clientState.buffer, 0, clientState.buffer.Length, SocketFlags.None, ReceiveCallback, clientState);
        }
    }


А про асинхронность смотря где. Например в файл данные можно тоже записывать асинхронно, и там асинхронный вызов может создать как и доп. поток, так и не создавать доп. потоков.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.09.2013, 14:20
Помогаю со студенческими работами здесь

Может кто-нибудь объяснить, как работает CellParsing в DataGridView?
Дали задание - использовать CellParsing с одним из полей DataGridVeiw. На сайте microsoft нашёл данное событие, прочитал то, что там...

Кто-нибудь может скинуть или указать ссылку на учебный проект C# через MS Access
Уважаемые форумчане кому не жалко или кто знает ссылки на проекты написанные на C# с использованием MS Access Заранее спасибо!!!) ...

кто нибудь может объяснить, что делает эта функция?
'самая загадочная функция, очевидно binary это файл представленный как набор байтов Function SeparateFields(Binary, Boundary) Dim...

Кто-нибудь может поделиться хорошим скриптом форума?
Люди, кто-нибудь может поделиться хорошим скриптом форума? Достаточно функциональным, но строгим, и без лишних наворотов... Что-то типа...

Есть задание - но смысл не понятен, может ли кто-нибудь обьяснить чего требуется?
Есть задание - но смысл не понятен, может ли кто-нибудь обьяснить это задание? Задание: Создать программу которая просматривает адреса...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru