一个简单的问题,但我也找不到任何一个问题。
当我执行异步套接字操作时,例如:
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!
答案 0 :(得分:2)
是C#,对象存储在分配的地方:)
真正的问题应该是:在异步操作期间谁有对象的引用?粗略的答案是:框架。更准确的答案是,您的对象最终由OVERLAPPED结构引用,通过托管和本机数据类型的混合,OVERLAPPED结构保存在内核的列表中。
答案 1 :(得分:2)
它存储在您创建它的位置。除非GarbageCollector发现必要,否则它不会移动。您只是分发对BeginSend()方法的引用,然后在OnSend [Complete]()方法中将其返回。