天天看點

[C#]I/O完成端口的類定義和測試執行個體

整理者:鄭昀@ultrapower 

日期:2005-04-13 

從william kennedy那裡整理過來的,不同之處在于他自己定義了一個overlapped,而我們這裡直接使用 

system.threading.nativeoverlapped:。 

附一段我以前的win32下的iocp文檔,如果您了解iocp也可以直接跳過看後面的c#測試示範: 

我們采用的是i/o complete port(以下簡稱iocp)處理機制。

簡單的講,當服務應用程式初始化時,它應該先建立一個i/o cp。我們在請求到來後,将得到的資料打包用postqueuedcompletionstatus發送到iocp中。這時需要建立一些個線程(7個線程/每cpu,再多就沒有意義了)來處理發送到iocp端口的消息。實作步驟大緻如下:

1     先在主線程中調用createiocompletionport建立iocp。

createiocompletionport的前三個參數隻在把裝置同complete port相關聯時才有用。

此時我們隻需傳遞invalid_handle_value,null和0即可。

第四個參數告訴端口同時能運作的最多線程數,這裡設定為0,表示預設為目前計算機的cpu數目。

2     我們的threadfun線程函數執行一些初始化之後,将進入一個循環,該循環會在服務程序終止時才結束。

在循環中,調用getqueuedcompletionstatus,這樣就把目前線程的id放入一個等待線程隊列中,i/o cp核心對象就總能知道哪個線程在等待處理完成的i/o請求。

如果在idle_thread_timeout規定的時間内i/o cp上還沒有出現一個completion packet,則轉入下一次循環。在這裡我們設定的idle_thread_timeout為1秒。

當端口的i/o完成隊列中出現一項時,完成端口就喚醒等待線程隊列中的這個線程,該線程将得到完成的i/o項中的資訊:       傳輸的位元組數、完成鍵和overlapped結構的位址。

在我們的程式中可以用智能指針或者bstr或者int來接受這個overlapped結構的位址的值,進而得到消息;然後在這個線程中處理消息。

getqueuedcompletionstatus的第一個參數hcompletionport指出了要監視哪一個端口,這裡我們傳送先前從createiocompletionport傳回的端口句柄。

需要注意的是:

第一,   線程池的數目是有限制的,和cpu數目有關系。

第二,   iocp是一種較為完美的睡眠/喚醒 線程機制;線程目前沒有任務要處理時,就進入睡眠狀态,進而不占用cpu資源,直到被核心喚醒;

第三,   最近一次剛執行完的線程,下次任務來的時候還會喚醒它;是以有可能比較少被調用的線程以後被調用的幾率也少。

測試代碼: 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

using system; 

[C#]I/O完成端口的類定義和測試執行個體

using system.threading;  // included for the thread.sleep call 

[C#]I/O完成端口的類定義和測試執行個體

using continuum.threading; 

[C#]I/O完成端口的類定義和測試執行個體

using system.runtime.interopservices; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

namespace iocpdemo 

[C#]I/O完成端口的類定義和測試執行個體

[C#]I/O完成端口的類定義和測試執行個體

    //=============================================================================

[C#]I/O完成端口的類定義和測試執行個體

    /// <summary> sample class for the threading class </summary> 

[C#]I/O完成端口的類定義和測試執行個體

    public class utilthreadingsample 

[C#]I/O完成端口的類定義和測試執行個體

    { 

[C#]I/O完成端口的類定義和測試執行個體

        //*****************************************************************************    

[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> test method </summary> 

[C#]I/O完成端口的類定義和測試執行個體

        static void main() 

[C#]I/O完成端口的類定義和測試執行個體

        { 

[C#]I/O完成端口的類定義和測試執行個體

            // create the mssql iocp thread pool 

[C#]I/O完成端口的類定義和測試執行個體

            iocpthreadpool pthreadpool = new iocpthreadpool(0, 10, 20, new iocpthreadpool.user_function(iocpthreadfunction)); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            //for(int i =1;i<10000;i++) 

[C#]I/O完成端口的類定義和測試執行個體

            { 

[C#]I/O完成端口的類定義和測試執行個體

                pthreadpool.postevent(1234); 

[C#]I/O完成端口的類定義和測試執行個體

            } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            thread.sleep(100); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            pthreadpool.dispose(); 

[C#]I/O完成端口的類定義和測試執行個體

        } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        //******************************************************************** 

[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> function to be called by the iocp thread pool.  called when 

[C#]I/O完成端口的類定義和測試執行個體

        ///           a command is posted for processing by the socketmanager </summary> 

[C#]I/O完成端口的類定義和測試執行個體

        /// <param name="ivalue"> the value provided by the thread posting the event </param> 

[C#]I/O完成端口的類定義和測試執行個體

        static public void iocpthreadfunction(int ivalue) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            try 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                console.writeline("value: {0}", ivalue.tostring()); 

[C#]I/O完成端口的類定義和測試執行個體

                thread.sleep(3000); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            catch (exception pexception) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                console.writeline(pexception.message); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

    } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

[C#]I/O完成端口的類定義和測試執行個體

類代碼: 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

using system.threading; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

namespace iocpthreading 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

    [structlayout(layoutkind.sequential, charset=charset.auto)] 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

    public sealed class iocpthreadpool 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        [dllimport("kernel32", charset=charset.auto)] 

[C#]I/O完成端口的類定義和測試執行個體

        private unsafe static extern uint32 createiocompletionport(uint32 hfile, uint32 hexistingcompletionport, uint32* puicompletionkey, uint32 uinumberofconcurrentthreads); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private unsafe static extern boolean closehandle(uint32 hobject); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private unsafe static extern boolean postqueuedcompletionstatus(uint32 hcompletionport, uint32 uisizeofargument, uint32* puiuserarg, system.threading.nativeoverlapped* poverlapped); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private unsafe static extern boolean getqueuedcompletionstatus(uint32 hcompletionport, uint32* psizeofargument, uint32* puiuserarg, system.threading.nativeoverlapped** ppoverlapped, uint32 uimilliseconds); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private const uint32 invalid_handle_value = 0xffffffff; 

[C#]I/O完成端口的類定義和測試執行個體

        private const uint32 inifinite = 0xffffffff; 

[C#]I/O完成端口的類定義和測試執行個體

        private const int32 shutdown_iocpthread = 0x7fffffff; 

[C#]I/O完成端口的類定義和測試執行個體

        public delegate void user_function(int ivalue); 

[C#]I/O完成端口的類定義和測試執行個體

        private uint32 m_hhandle; 

[C#]I/O完成端口的類定義和測試執行個體

        private uint32 gethandle { get { return m_hhandle; } set { m_hhandle = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 m_uimaxconcurrency; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 getmaxconcurrency { get { return m_uimaxconcurrency; } set { m_uimaxconcurrency = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 m_iminthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 getminthreadsinpool { get { return m_iminthreadsinpool; } set { m_iminthreadsinpool = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 m_imaxthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 getmaxthreadsinpool { get { return m_imaxthreadsinpool; } set { m_imaxthreadsinpool = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private object m_pcriticalsection; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private object getcriticalsection { get { return m_pcriticalsection; } set { m_pcriticalsection = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private user_function m_pfnuserfunction; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private user_function getuserfunction { get { return m_pfnuserfunction; } set { m_pfnuserfunction = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private boolean m_bdisposeflag; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: flag to indicate if the class is disposing </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private boolean isdisposed { get { return m_bdisposeflag; } set { m_bdisposeflag = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 m_icurthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: the current number of threads in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        public int32 getcurthreadsinpool { get { return m_icurthreadsinpool; } set { m_icurthreadsinpool = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: increment current number of threads in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 inccurthreadsinpool() { return interlocked.increment(ref m_icurthreadsinpool); } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: decrement current number of threads in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 deccurthreadsinpool() { return interlocked.decrement(ref m_icurthreadsinpool); } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 m_iactthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: the current number of active threads in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        public int32 getactthreadsinpool { get { return m_iactthreadsinpool; } set { m_iactthreadsinpool = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: increment current number of active threads in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 incactthreadsinpool() { return interlocked.increment(ref m_iactthreadsinpool); } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: decrement current number of active threads in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 decactthreadsinpool() { return interlocked.decrement(ref m_iactthreadsinpool); } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 m_icurworkinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: the current number of work posted in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        public int32 getcurworkinpool { get { return m_icurworkinpool; } set { m_icurworkinpool = value; } } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: increment current number of work posted in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 inccurworkinpool() { return interlocked.increment(ref m_icurworkinpool); } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        /// <summary> simtype: decrement current number of work posted in the thread pool </summary> 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private int32 deccurworkinpool() { return interlocked.decrement(ref m_icurworkinpool); } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        public iocpthreadpool(int32 imaxconcurrency, int32 iminthreadsinpool, int32 imaxthreadsinpool, user_function pfnuserfunction) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // set initial class state 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getmaxconcurrency   = imaxconcurrency; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getminthreadsinpool = iminthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getmaxthreadsinpool = imaxthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getuserfunction     = pfnuserfunction; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // init the thread counters 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getcurthreadsinpool = 0; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getactthreadsinpool = 0; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getcurworkinpool    = 0; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // initialize the monitor object 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                getcriticalsection = new object(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // set the disposing flag to false 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                isdisposed = false; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                unsafe 

[C#]I/O完成端口的類定義和測試執行個體

                { 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // create an io completion port for thread pool use 

[C#]I/O完成端口的類定義和測試執行個體

                    gethandle = createiocompletionport(invalid_handle_value, 0, null, (uint32) getmaxconcurrency); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // test to make sure the io completion port was created 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                if (gethandle == 0) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    throw new exception("unable to create io completion port"); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // allocate and start the minimum number of threads specified 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                int32 istartingcount = getcurthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                threadstart tsthread = new threadstart(iocpfunction); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                for (int32 ithread = 0; ithread < getminthreadsinpool; ++ithread) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // create a thread and start it 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    thread ththread = new thread(tsthread); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    ththread.name = "iocp " + ththread.gethashcode(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    ththread.start(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // increment the thread pool count 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    inccurthreadsinpool(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            catch 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                throw new exception("unhandled exception"); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        ~iocpthreadpool() 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            if (!isdisposed) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                dispose(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        public void dispose() 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // flag that we are disposing this object 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                isdisposed = true; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // get the current number of threads in the pool 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                int32 icurthreadsinpool = getcurthreadsinpool; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // shutdown all thread in the pool 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                for (int32 ithread = 0; ithread < icurthreadsinpool; ++ithread) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    unsafe 

[C#]I/O完成端口的類定義和測試執行個體

                    { 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        bool bret = postqueuedcompletionstatus(gethandle, 4, (uint32*) shutdown_iocpthread, null); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // wait here until all the threads are gone 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                while (getcurthreadsinpool != 0) thread.sleep(100); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // close the iocp handle 

[C#]I/O完成端口的類定義和測試執行個體

                    closehandle(gethandle); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        private void iocpfunction() 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            uint32 uinumberofbytes; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            int32  ivalue; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                while (true) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        system.threading.nativeoverlapped* pov; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        // wait for an event 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        getqueuedcompletionstatus(gethandle, &uinumberofbytes, (uint32*) &ivalue, &pov, inifinite); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // decrement the number of events in queue 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    deccurworkinpool(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // was this thread told to shutdown 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    if (ivalue == shutdown_iocpthread) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        break; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // increment the number of active threads 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    incactthreadsinpool(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    try 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        // call the user function 

[C#]I/O完成端口的類定義和測試執行個體

                        getuserfunction(ivalue); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    catch(exception ex) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        throw ex; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // get a lock 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    monitor.enter(getcriticalsection); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        // if we have less than max threads currently in the pool 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        if (getcurthreadsinpool < getmaxthreadsinpool) 

[C#]I/O完成端口的類定義和測試執行個體

                        { 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                            // should we add a new thread to the pool 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                            if (getactthreadsinpool == getcurthreadsinpool) 

[C#]I/O完成端口的類定義和測試執行個體

                            { 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                if (isdisposed == false) 

[C#]I/O完成端口的類定義和測試執行個體

                                { 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                    // create a thread and start it 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                    threadstart tsthread = new threadstart(iocpfunction); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                    thread ththread = new thread(tsthread); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                    ththread.name = "iocp " + ththread.gethashcode(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                    ththread.start(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                    // increment the thread pool count 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                    inccurthreadsinpool(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                                } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                            } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        } 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    catch 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // relase the lock 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    monitor.exit(getcriticalsection); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    decactthreadsinpool(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            catch(exception ex) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                string str=ex.message; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            // decrement the thread pool count 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            deccurthreadsinpool(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        //public void postevent(int32 ivalue 

[C#]I/O完成端口的類定義和測試執行個體

        public void postevent(int ivalue) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                // only add work if we are not disposing 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                if (isdisposed == false) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        // post an event into the iocp thread pool 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        postqueuedcompletionstatus(gethandle, 4, (uint32*) ivalue, null); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // increment the number of item of work 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    inccurworkinpool(); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                    // release the lock 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

            catch (exception e) 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                throw e; 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        }   

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

        public void postevent() 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體

                        postqueuedcompletionstatus(gethandle, 0, null, null); 

[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體
[C#]I/O完成端口的類定義和測試執行個體