async_read_some връщане

Има ли начин в Boost::ASIO да разберете дали async_read_some няма да се върне в определен период от време, за да извикате функция, без да затваряте сокета? Обикновено async_read_some() няма да се върне, ако няма повече данни за прехвърляне към буфера.

 _socket->async_read_some(
     boost::asio::buffer(this->reply, sizeof(this>reply)),
     boost::bind(
         &TCP_IP_Connection::dataProcess,
         this,
         boost::asio::placeholders::error,
         boost::asio::placeholders::bytes_transferred
     )
 );

person Jishnu U Nair    schedule 13.03.2013    source източник
comment

Имам статичен обект [] масив (500+ елемента), който се променя всяка секунда и много контроли, които трябва да показват данните, съдържащи се в този масив. Имам нужда този масив да е статичен, защото се използва в много други класове.

Възможно ли е да се приложи такова свързване в .NET 4.5? Опитвам кода по-долу без успех (на базата на http://www.jonathanantoine.com/2011/09/28/wpf-4-5-%E2%80%93-part-9-binding-to-static-properties/ ). Получавам грешка „Playback.Control“ не внедрява члена на интерфейса „System.ComponentModel.INotifyPropertyChanged.PropertyChanged“ при компилиране

public class Control : INotifyPropertyChanged
{
    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
    public static void RaiseChangeEvent(string propName)
    {
        EventHandler<PropertyChangedEventArgs> handler = StaticPropertyChanged;
        if (handler != null)
        handler(null, new PropertyChangedEventArgs(propName));
    }

    private static int _playposition;
    public static int PlayPosition { get { return _playposition; } set { if (_playposition == value) return; _playposition = value; RaiseChangeEvent("PlayPosition"); } }

    public static DataTable JobData { get; private set; }

    private static Object[] _currentdata;
    public static Object[] CurrentData { get { return _currentdata; } set { if (_currentdata == value) return; _currentdata = value; RaiseChangeEvent("CurrentData"); } }

    private static Object[] _previousdata;
    public static Object[] PreviousData { get { return _previousdata; } set { if (_previousdata == value) return; _previousdata = value; RaiseChangeEvent("PreviousData"); } }
}
  -  person Tanner Sansbury    schedule 13.03.2013
comment
Благодаря, но не искам да прекъсвам връзката.   -  person Jishnu U Nair    schedule 13.03.2013
comment
Тогава не се обаждайте на socket::close()? Подходът е в примера.   -  person Tanner Sansbury    schedule 13.03.2013
comment
Бихте ли обяснили малко по-добре какво ви притеснява тук и какво се опитвате да направите?   -  person Bob Bryan    schedule 13.03.2013
comment
Това е част от TCP клиентска програма. Опитвам се да прочета отговор на команда от сървъра. Когато всички данни от потока се прочетат, async_read_some() блокира, докато има данни за прехвърляне към буфера. Така че искам да се уверя, че по време на това състояние на блокиране сървърът все още е свързан, по някакъв начин. Според по-ранните коментари, чета примерите от Boost за изчакване.   -  person Jishnu U Nair    schedule 13.03.2013
comment
@JishnuUNair async_read_some не блокира, той е асинхронен, както подсказва името му. Освен това документацията ясно заявява, че се връща незабавно. Въпросът ви не е ясен, моля, редактирайте го и изяснете. Може би публикуването на още псевдо код може да помогне?   -  person Sam Miller    schedule 14.03.2013


Отговори (1)


async_read_some винаги се връща незабавно.

Ако говорите за манипулатора (обратно извикване), ако затворите сокета, преди да се върне, тогава мисля, че манипулаторът се извиква с asio::error::operation_aborted. Ако се справите с този сценарий, тогава може би няма нужда да се притеснявате дали сте свързани или не.

person Peter Tseng    schedule 06.12.2016