-1

A простой вопрос действительно, но один, где я тоже не могу найти андерсеров.C# .. Асинхронные сокеты .. где хранится объект состояния?

Когда я выполняю операцию асинхронных сокетов, такие как:

socket.BeginSend 
(
    new byte[]{6},    // byte[]  | buffer 
    0,       // int   | data to send buffer offset 
    1,       // int   | data to send length 
    SocketFlags.None,    // enum   | dunno :) 
    new AsyncCallback(OnSend), // AsyncCallback | callback method 
    STATEOBJECT     // object  | ..state object.. 
); 

Он работает, и при завершении он вызывает параметр AsyncCallback, проходя вместе с ним и IAsyncResult.

void OnSend(IAsyncResult ar) 
{ 
    object STATEOBJECT = ar.AsyncState as object; 
    /* 
     Process the socket operation 
    */ 
} 

SO ..

Когда операция сокета выполняется «асинхронно» Я знаю, что из различных источников, что буфер возлагали в памяти.

Однако я не знаю, где хранится «объект состояния»?

Почему? потому что мне интересно, что будет иметь эффект большого «объекта состояния»?

Taa!

ответ

2

Является ли C# объект хранится где выделяются :)

Реальный вопрос должен быть: у кого есть ссылка на объект во время асинхронной операции? Грубый ответ: структура. Более точный ответ заключается в том, что ваш объект в конечном счете ссылается на структуру OVERLAPPED, используя смесь управляемых и собственных типов данных, а структура OVERLAPPED хранится в списке в ядре.

+0

Overlapped ??? что это перекрывается! спасибо больше информации, чтобы переварить :) – divinci

+0

Если вы хотите узнать о том, что на самом деле происходит, получите копию Inside Windows Соломо/Руссинович. Если вы хотите использовать async IO, перейдите по статьям, связанным в http://rusanu.com/2008/11/11/high-performance-windows-programs/. Эти концепции применимы и к Managet .Net/C#. –

+0

Спасибо Ремусу, £ 4.26, использованному на amazon :) – divinci

2

Он хранится там, где вы его создали, на куче. И он не будет двигаться, если GarbageCollector не найдет нужное. Вы просто передаете ссылку на метод BeginSend() и возвращаете его обратно в метод OnSend [Complete]().

Смежные вопросы