首页 新闻 会员 周边

请教CreateIoCompletionPort在c#里如何

0
[已解决问题] 解决于 2008-07-12 20:05
请教CreateIoCompletionPort在c#里如何使用<br>[DllImport("kernel32.dll")]<br> static extern IntPtr CreateIoCompletionPort(IntPtr FileHandle,<br> &nbsp;&nbsp; IntPtr ExistingCompletionPort, UIntPtr CompletionKey,<br> &nbsp;&nbsp; uint NumberOfConcurrentThreads);<br>上面是原型,其中CompletionKey这个参数的类型是UIntPtr,这个参数在C++里可以随便传一个结构进去,完了可以在获取完成端口状态(GetQueuedCompletionStatus)的时候取出来,可我怎么才能把c#里的一个类转换成UIntPtr类型呀。<br>c++里的定义如下<br>CreateIoCompletionPort(<br>&nbsp;&nbsp;&nbsp; __in&nbsp;&nbsp;&nbsp;&nbsp; HANDLE FileHandle,<br>&nbsp;&nbsp;&nbsp; __in_opt HANDLE ExistingCompletionPort,<br>&nbsp;&nbsp;&nbsp; __in&nbsp;&nbsp;&nbsp;&nbsp; ULONG_PTR CompletionKey,<br>&nbsp;&nbsp;&nbsp; __in&nbsp;&nbsp;&nbsp;&nbsp; DWORD NumberOfConcurrentThreads<br>&nbsp;&nbsp;&nbsp; );<br>使用的时候如下<br>CreateIoCompletionPort((HANDLE) Accept, CompletionPort, (DWORD) PerHandleData,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0)<br>其中PerHandleData是一个struct,定义如下<br>typedef struct <br>{<br>&nbsp;&nbsp; SOCKET Socket;<br>} PER_HANDLE_DATA, * LPPER_HANDLE_DATA;<br>而我的c#的定义如下<br>[StructLayout(LayoutKind.Sequential)]<br>class PER_HANDLE_DATA<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; public SafeHandleMinusOneIsInvalid Socket;<br>}<br>我的调用如下<br>GCHandle gch_PerHandleData = GCHandle.Alloc(PerHandleData);<br>PerHandleData.Socket = Accept;<br>SafeFileHandle iocp = CreateIoCompletionPort(Accept.DangerousGetHandle(),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CompletionPort.DangerousGetHandle(),(IntPtr) gch_PerHandleData, 0);<br>gch_PerHandleData.Free();<br><br>当然上面的代码肯定不对,我把GCHandle强制转换成IntPtr了,我如何转换成UIntPtr呀。
蛙蛙王子的主页 蛙蛙王子 | 菜鸟二级 | 园豆:265
提问于:2008-07-10 23:57
< >
分享
最佳答案
0
印象中,.Net的ThreadPool就是采用完成端口模型的,不知道你是做何种应用,一般情况下应该是不需要自己封装的。
RogerTong | 菜鸟二级 |园豆:230 | 2008-07-12 01:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册