Асинхронное чтение из сокета (C#)

444
09 декабря 2016, 08:59

Необходимо асинхронно читать данные из сокета (NetworkStream) и выполнять действия в зависимости от считанных данных. В бескрайних просторах интернета встречается несколько парадигм, две из которых EAP (event-based asynchronous programming) и TAP (task-based asynchronous programming).

Второй вариант хорошо подходит для моей задачи, но, увы, ключевые слова async и await введены с 5-й версии C#, которую Unity (на которой у меня проект) не поддерживает. По EAP не нашёл понятных примеров, поэтому слабо представляю, как им пользоваться.

Подскажите, как реализовать асинхронное чтение из сокета?

Answer 1

NetworkStream не поддерживает EAP. Кроме TAP он поддерживает APM методами BeginRead()/EndRead(). APM -- это asynchronous programming model, самая первая реализация асинхронного программирования в .NET.

Процесс чтение данных при этом будет выглядеть примерно так:

AsyncCallback callback = 
    ar =>
    { 
        int bytesRead = myNetworkStream.EndRead(ar);
        // обрабатываем полученные данные
        // при необходимости снова читаем данные
        networkStream.BeginRead(buffer, offset, count, callback, null);
    };
// первоначальный вызов,
// networkStream как вариант можно передавать в качестве последнего параметра,
// а затем получать его из IAsyncResult.AsyncState
networkStream.BeginRead(buffer, offset, count, callback, null);
READ ALSO
custom keyboard для telegram bot

custom keyboard для telegram bot

Я новичок в C# и что бы хоть не много попрактиковаться решил попробовать написать бота для телеграмаВсё бы ничего но у меня не получается создать...

470
Загрузить текущую сцену Unity

Загрузить текущую сцену Unity

Как загрузить текущую сцену Unity? Пробовал так

393
Unit Test UDP sender

Unit Test UDP sender

Как протестировать, написать unit test для UDP sender? Код:

353