-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

重疊?這是什麼重疊!感謝更多信息摘要:) – divinci 2009-11-20 22:14:55

+0

如果您想了解真正發生的事情,請獲取Solomo/Russinovich的Inside Windows副本。如果您想要高效地使用異步IO,請參閱http://rusanu.com/2008/11/11/high-performance-windows-programs/中鏈接的文章。這些概念同樣適用於Managet .Net/C#。 – 2009-11-20 22:18:42

+0

感謝Remus,4.26英鎊用於亞馬遜:) – divinci 2009-11-20 22:38:42

2

它被存儲在你創建堆的地方。除非GarbageCollector發現必要,否則它不會移動。你只是發出對BeginSend()方法的引用,然後你將它返回到OnSend [Complete]()方法中。