開始我也一樣迷惑怎樣傳送對象引用,後來經過研究發現可以這樣解決完成端口傳送對象的問題。使用以下方式來聲明api:
[DllImport("Kernel32")]
private static extern bool PostQueuedCompletionStatus(UInt32 completionPort, int numberOfBytesTransferred,IntPtr completionKey, IntPtr overlapped);
[DllImport("Kernel32")]
private static extern bool GetQueuedCompletionStatus(UInt32 completionPort, ref int numberOfBytes,ref IntPtr completionKey, ref IntPtr overlapped,UInt32 milliseconds);
使用GetQueuedCompletionStatus和PostQueuedCompletionStatus的時候,用GCHandle對象來取得對象的指針,再傳送給它們作為參數就可以了。
int i=0;
object Value=new object();
GCHandle gcValue=GCHandle.Alloc(Value);
GCHandle gcKey=GCHandle.Alloc(i);
// Post an event into the IOCP Thread Pool
PostQueuedCompletionStatus(GetHandle, 4, (IntPtr)gcKey, (IntPtr)gcValue);
其它的按這個思路去解決就可以了。