C#..异步套接字..状态对象存储在哪里?

时间:2009-11-20 21:59:25

标签: multithreading memory sockets memory-management asynchronous

一个简单的问题,但我也找不到任何一个问题。

当我执行异步套接字操作时,例如:

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 个答案:

答案 0 :(得分:2)

是C#,对象存储在分配的地方:)

真正的问题应该是:在异步操作期间谁有对象的引用?粗略的答案是:框架。更准确的答案是,您的对象最终由OVERLAPPED结构引用,通过托管和本机数据类型的混合,OVERLAPPED结构保存在内核的列表中。

答案 1 :(得分:2)

它存储在您创建它的位置。除非GarbageCollector发现必要,否则它不会移动。您只是分发对BeginSend()方法的引用,然后在OnSend [Complete]()方法中将其返回。