Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
C#×ۺϽÒÃØ¡ª¡ªÏ¸Ëµ¶àỊ̈߳¨ÖУ©
 
×÷Õß ·ç³¾ÀË×ӵIJ©¿Í£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-08-01
  4185  次浏览      27
 

ÒýÑÔ

±¾ÎÄÖ÷Òª´ÓÏ̵߳Ļù´¡Ó÷¨£¬CLRÏ̳߳ص±Öй¤×÷ÕßÏß³ÌÓëI/OÏ̵߳Ŀª·¢£¬²¢ÐвÙ×÷PLINQµÈ¶à¸ö·½Ãæ½éÉܶàÏ̵߳Ŀª·¢¡£C#×ۺϽÒÃØ¡ª¡ªÏ¸Ëµ¶àỊ̈߳¨ÉÏ£©

Ŀ¼

Ò»¡¢Ï̵͍߳Òå

¶þ¡¢Ï̵߳Ļù´¡ÖªÊ¶

Èý¡¢ÒÔThreadStart·½Ê½ÊµÏÖ¶àÏß³Ì

ËÄ¡¢CLRÏ̳߳صŤ×÷ÕßÏß³Ì

Îå¡¢CLRÏ̳߳صÄI/OÏß³Ì

Áù¡¢Òì²½ SqlCommand

Æß¡¢²¢Ðбà³ÌÓëPLINQ

°Ë¡¢¼ÆÊ±Æ÷ÓëËø

Îå¡¢CLRÏ̳߳صÄI/OÏß³Ì

ÔÚǰһ½ÚËù½éÉܵÄÏ̶߳¼ÊôÓÚCLRÏ̳߳صŤ×÷ÕßỊ̈߳¬ÕâÒ»½Ú¿ªÊ¼Îª´ó¼Ò½éÉÜÒ»ÏÂCLRÏ̳߳صÄI/OÏß³Ì

I/O Ïß³ÌÊÇ.NETרΪ·ÃÎÊÍⲿ×ÊÔ´ËùÉèÖõÄÒ»ÖÖỊ̈߳¬ÒòΪ·ÃÎÊÍⲿ×ÊÔ´³£³£ÒªÊܵ½Íâ½çÒòËØµÄÓ°Ï죬ΪÁË·ÀÖ¹ÈÃÖ÷Ïß³ÌÊÜÓ°Ïì¶ø³¤ÆÚ´¦ÓÚ×èÈû״̬£¬.NETΪ¶à¸öI/O²Ù×÷¶¼½¨Á¢ÆðÁËÒì²½·½·¨£¬ÀýÈ磺FileStream¡¢TCP/IP¡¢WebRequest¡¢WebServiceµÈµÈ£¬¶øÇÒÿ¸öÒì²½·½·¨µÄʹÓ÷½Ê½¶¼·Ç³£ÀàËÆ£¬¶¼ÊÇÒÔBeginXXXΪ¿ªÊ¼£¬ÒÔEndXXX½áÊø£¬ÏÂÃæÎª´ó¼ÒÒ»Ò»½â˵¡£

5.1 Òì²½¶Áд FileStream

ÐèÒªÔÚ FileStream Òì²½µ÷Óà I/OỊ̈߳¬±ØÐëʹÓÃÒÔϹ¹Ô캯Êý½¨Á¢ FileStream ¶ÔÏ󣬲¢°ÑuseAsyncÉèÖÃΪ true¡£

FileStream stream = new FileStream ( string path, FileMode mode, FileAccess access, FileShare share, int bufferSize,bool useAsync ) ;

ÆäÖÐ path ÊÇÎļþµÄÏà¶Ô·¾¶»ò¾ø¶Ô·¾¶; mode È·¶¨ÈçºÎ´ò¿ª»ò´´½¨Îļþ; access È·¶¨·ÃÎÊÎļþµÄ·½Ê½; share È·¶¨ÎļþÈçºÎ½ø³Ì¹²Ïí; bufferSize ÊÇ´ú±í»º³åÇø´óС,Ò»°ãĬÈÏ×îСֵΪ8£¬ÔÚÆô¶¯Òì²½¶ÁÈ¡»òдÈëʱ£¬Îļþ´óСһ°ã´óÓÚ»º³å´óС; userAsync´ú±íÊÇ·ñÆô¶¯Òì²½I/OÏ̡߳£

×¢Ò⣺µ±Ê¹Óà BeginRead ºÍ BeginWrite ·½·¨ÔÚÖ´ÐдóÁ¿¶Á»òдʱЧ¹û¸üºÃ£¬µ«¶ÔÓÚÉÙÁ¿µÄ¶Á/д£¬ÕâЩ·½·¨ËÙ¶È¿ÉÄܱÈͬ²½¶ÁÈ¡»¹ÒªÂý£¬ÒòΪ½øÐÐÏ̼߳äµÄÇл»ÐèÒª´óÁ¿Ê±¼ä¡£

5.1.1 Ò첽дÈë

FileStreamÖаüº¬BeginWrite¡¢EndWrite ·½·¨¿ÉÒÔÆô¶¯I/OÏ߳̽øÐÐÒ첽дÈë¡£

public override IAsyncResult BeginWrite ( byte[] array, int offset, int numBytes, AsyncCallback userCallback, Object stateObject )
public override void EndWrite (IAsyncResult asyncResult )

BeginWrite ·µ»ØÖµÎªIAsyncResult, ʹÓ÷½Ê½ÓëίÍеÄBeginInvoke·½·¨ÏàËÆ£¬×îºÃ¾ÍÊÇʹÓûص÷º¯Êý£¬±ÜÃâÏß³Ì×èÈû¡£ÔÚ×îºóÁ½¸ö²ÎÊýÖУ¬²ÎÊýAsyncCallbackÓÃÓڰ󶨻ص÷º¯Êý; ²ÎÊýObjectÓÃÓÚ´«µÝÍⲿÊý¾Ý¡£Òª×¢ÒâÒ»µã£ºAsyncCallbackËù°ó¶¨µÄ»Øµ÷º¯Êý±ØÐëÊÇ´øµ¥¸ö IAsyncResult ²ÎÊýµÄÎÞ·µ»ØÖµ·½·¨¡£

ÔÚÀý×ÓÖУ¬°ÑFileStream×÷ΪÍⲿÊý¾Ý´«µÝµ½»Øµ÷º¯Êýµ±ÖУ¬È»ºóÔڻص÷º¯ÊýÖÐÀûÓÃIAsyncResult.AsyncState»ñÈ¡FileStream¶ÔÏó£¬×îºóͨ¹ýFileStream.EndWrite£¨IAsyncResult£©½áÊøÐ´Èë¡£

class Program
    {
        static void Main(string[] args)
        {
            //°ÑÏ̳߳صÄ×î´óÖµÉèÖÃΪ1000
            ThreadPool.SetMaxThreads(1000, 1000);
            ThreadPoolMessage("Start");

            //ÐÂÁ¢ÎļþFile.sour
            FileStream stream = new FileStream("File.sour", FileMode.OpenOrCreate, 
                                       FileAccess.ReadWrite,FileShare.ReadWrite,1024,true);
            byte[] bytes = new byte[16384];
            string message = "An operating-system ThreadId has no fixed relationship........";
            bytes = Encoding.Unicode.GetBytes(message);

            //Æô¶¯Ò첽дÈë
            stream.BeginWrite(bytes, 0, (int)bytes.Length,new AsyncCallback(Callback),stream);
            stream.Flush();
            
            Console.ReadKey();
        }

        static void Callback(IAsyncResult result)
        {
            //ÏÔʾÏ̳߳ØÏÖ×´
            Thread.Sleep(200);
            ThreadPoolMessage("AsyncCallback");
            //½áÊøÒ첽дÈë
            FileStream stream = (FileStream)result.AsyncState;
            stream.EndWrite(result);
            stream.Close();
        }

        //ÏÔʾÏ̳߳ØÏÖ×´
        static void ThreadPoolMessage(string data)
        {
            int a, b;
            ThreadPool.GetAvailableThreads(out a, out b);
            string message = string.Format("{0}\n  CurrentThreadId is {1}\n  "+
                  "WorkerThreads is:{2}  CompletionPortThreads is :{3}",
                  data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());
            Console.WriteLine(message);
        }
    }

ÓÉÊä³ö½á¹û¿ÉÒÔ¿´µ½£¬ÔÚʹÓÃFileStream.BeginWrite·½·¨ºó£¬ÏµÍ³½«×Ô¶¯Æô¶¯CLRÏ̳߳ØÖÐI/OÏ̡߳£

5.1.2 Òì²½¶ÁÈ¡

FileStream Öаüº¬ BeginRead Óë EndRead ¿ÉÒÔÒì²½µ÷ÓÃI/OÏ߳̽øÐжÁÈ¡¡£

public override IAsyncResult BeginRead ( byte[] array,int offset,int numBytes, AsyncCallback userCallback,Object stateObject)
public override int EndRead(IAsyncResult asyncResult)

ÆäʹÓ÷½Ê½ÓëBeginWriteºÍEndWriteÏàËÆ£¬AsyncCallbackÓÃÓڰ󶨻ص÷º¯Êý; ObjectÓÃÓÚ´«µÝÍⲿÊý¾Ý¡£Ôڻص÷º¯ÊýÖ»ÐèҪʹÓÃIAsyncResut.AsyncState¾Í¿É»ñÈ¡ÍⲿÊý¾Ý¡£EndWrite ·½·¨»á·µ»Ø´ÓÁ÷¶ÁÈ¡µ½µÄ×Ö½ÚÊýÁ¿¡£

Ê×Ïȶ¨Òå FileData À࣬ÀïÃæ°üº¬FileStream¶ÔÏó£¬byte[] Êý×éºÍ³¤¶È¡£È»ºó°ÑFileData¶ÔÏó×÷ΪÍⲿÊý¾Ý´«µ½»Øµ÷º¯Êý£¬Ôڻص÷º¯ÊýÖУ¬°ÑIAsyncResult.AsyncStateÇ¿ÖÆ×ª»»ÎªFileData£¬È»ºóͨ¹ýFileStream.EndRead£¨IAsyncResult£©½áÊø¶ÁÈ¡¡£×îºó±È½Ïһϳ¤¶È£¬Èô¶ÁÈ¡µ½µÄ³¤¶ÈÓëÊäÈëµÄÊý¾Ý³¤¶È²»Ò»ÖÁ£¬ÔòÅ׳öÒì³£¡£

class Program
     {
         public class FileData
         {
             public FileStream Stream;
             public int Length;
             public byte[] ByteData;
         }
 
         static void Main(string[] args)
         {       
             //°ÑÏ̳߳صÄ×î´óÖµÉèÖÃΪ1000
             ThreadPool.SetMaxThreads(1000, 1000);
             ThreadPoolMessage("Start");
             ReadFile();
 
             Console.ReadKey();
         }
 
         static void ReadFile()
         {
             byte[] byteData=new byte[80961024];
             FileStream stream = new FileStream("File1.sour", FileMode.OpenOrCreate, 
                                     FileAccess.ReadWrite, FileShare.ReadWrite, 1024, true);
             
             //°ÑFileStream¶ÔÏó,byte[]¶ÔÏ󣬳¤¶ÈµÈÓйØÊý¾Ý°ó¶¨µ½FileData¶ÔÏóÖУ¬ÒÔ¸½´øÊôÐÔ·½Ê½Ë͵½»Øµ÷º¯Êý
             FileData fileData = new FileData();
             fileData.Stream = stream;
             fileData.Length = (int)stream.Length;
             fileData.ByteData = byteData;
             
             //Æô¶¯Òì²½¶ÁÈ¡
             stream.BeginRead(byteData, 0, fileData.Length, new AsyncCallback(Completed), fileData);
         }
  
         static void Completed(IAsyncResult result)
         {
             ThreadPoolMessage("Completed");
 
             //°ÑAsyncResult.AsyncStateת»»ÎªFileData¶ÔÏó£¬ÒÔFileStream.EndReadÍê³ÉÒì²½¶ÁÈ¡
             FileData fileData = (FileData)result.AsyncState;
             int length=fileData.Stream.EndRead(result);
             fileData.Stream.Close();
 
             //Èç¹û¶ÁÈ¡µ½µÄ³¤¶ÈÓëÊäÈ볤¶È²»Ò»Ö£¬ÔòÅ׳öÒì³£
             if (length != fileData.Length)
                 throw new Exception("Stream is not complete!");
 
             string data=Encoding.ASCII.GetString(fileData.ByteData, 0, fileData.Length);
             Console.WriteLine(data.Substring(2,22));
         }
 
         //ÏÔʾÏ̳߳ØÏÖ×´
         static void ThreadPoolMessage(string data)
         {
             int a, b;
             ThreadPool.GetAvailableThreads(out a, out b);
             string message = string.Format("{0}\n  CurrentThreadId is {1}\n  "+
                          "WorkerThreads is:{2}  CompletionPortThreads is :{3}",
                          data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());
             Console.WriteLine(message);      
         }
             
   }

ÓÉÊä³ö½á¹û¿ÉÒÔ¿´µ½£¬ÔÚʹÓÃFileStream.BeginRead·½·¨ºó£¬ÏµÍ³½«×Ô¶¯Æô¶¯CLRÏ̳߳ØÖÐI/OÏ̡߳£

×¢Ò⣺Èç¹ûÄã¿´µ½µÄ²âÊÔ½á¹ûÕýºÃÏà·´£º¹¤×÷ÕßÏß³ÌΪ999£¬I/OÏß³ÌΪ1000£¬ÕâÊÇÒòΪFileStreamµÄÎļþÈÝÁ¿Ð¡ÓÚ»º³åÖµ1024ËùÖµġ£´ËʱÎļþ½«»áÒ»´ÎÐÔ¶ÁÈ¡»òдÈ룬¶øÏµÍ³½«Æô¶¯¹¤×÷ÕßÏ̶߳ø·ÇI/OÏß³ÌÀ´´¦Àí»Øµ÷º¯Êý¡£

5.2 Òì²½²Ù×÷TCP/IPÌ×½Ó×Ö

ÔÚ½éÉÜ TCP/IP Ì×½Ó×ÖǰÏȼòµ¥½éÉÜһϠNetworkStream À࣬ËüÊÇÓÃÓÚÍøÂç·ÃÎʵĻù´¡Êý¾ÝÁ÷¡£ NetworkStream ÌṩÁ˺ü¸¸ö·½·¨¿ØÖÆÌ×½Ó×ÖÊý¾ÝµÄ·¢ËÍÓë½ÓÊÕ, ÆäÖÐBeginRead¡¢EndRead¡¢BeginWrite¡¢EndWrite Äܹ»ÊµÏÖÒì²½²Ù×÷£¬¶øÇÒÒì²½Ïß³ÌÊÇÀ´×ÔÓÚCLRÏ̳߳صÄI/OÏ̡߳£

public override int ReadByte ()
public override int Read (byte[] buffer,int offset, int size)

public override void WriteByte (byte value)
public override void Write (byte[] buffer,int offset, int size)

public override IAsyncResult BeginRead (byte [] buffer, int offset, int size,  AsyncCallback callback, Object state )
public override int EndRead(IAsyncResult result)

public override IAsyncResult BeginWrite (byte [] buffer, int offset, int size,  AsyncCallback callback, Object state )
public override void EndWrite(IAsyncResult result)

ÈôÒª´´½¨ NetworkStream£¬±ØÐëÌṩÒÑÁ¬½ÓµÄ Socket¡£¶øÔÚ.NETÖÐʹÓÃTCP/IPÌ×½Ó×Ö²»ÐèÒªÖ±½ÓÓëSocket´ò½»µÀ£¬ÒòΪ.NET°ÑSocketµÄ´ó²¿·Ö²Ù×÷¶¼·ÅÔÚSystem.Net.TcpListenerºÍSystem.Net.Sockets.TcpClientÀïÃæ£¬ÕâÁ½¸öÀà´ó´óµØ¼ò»¯ÁËSocketµÄ²Ù×÷¡£Ò»°ãÌ×½Ó×Ö¶ÔÏóSocket°üº¬Ò»¸öAccept£¨£©·½·¨£¬´Ë·½·¨ÄܲúÉú×èÈûÀ´µÈ´ý¿Í»§¶ËµÄÇëÇ󣬶øÔÚTcpListenerÀàÀïÒ²°üº¬ÁËÒ»¸öÏàËÆµÄ·½·¨ public TcpClient AcceptTcpClient£¨£©ÓÃÓڵȴý¿Í»§¶ËµÄÇëÇó¡£´Ë·½·¨½«»á·µ»ØÒ»¸öTcpClient ¶ÔÏó£¬Í¨¹ý TcpClient µÄ public NetworkStream GetStream£¨£©·½·¨¾ÍÄÜ»ñÈ¡NetworkStream¶ÔÏ󣬿ØÖÆÌ×½Ó×ÖÊý¾ÝµÄ·¢ËÍÓë½ÓÊÕ¡£

ÏÂÃæÒÔÒ»¸öÀý×Ó˵Ã÷Òì²½µ÷ÓÃTCP/IPÌ×½Ó×ÖÊÕ·¢Êý¾ÝµÄ¹ý³Ì¡£

Ê×ÏÈÔÚ·þÎñÆ÷¶Ë½¨Á¢Ä¬ÈϵØÖ·127.0.0.1ÓÃÓÚÊÕ·¢ÐÅÏ¢£¬Ê¹Óô˵ØÖ·Óë¶Ë¿Ú500н¨TcpListener¶ÔÏ󣬵÷ÓÃTcpListener.Start ÕìÌý´«ÈëµÄÁ¬½ÓÇëÇó£¬ÔÙʹÓÃÒ»¸öËÀÑ­»·À´¼àÌýÐÅÏ¢¡£

ÔÚChatClientÀà°üÀ¨ÓнÓÊÕÐÅÏ¢Óë·¢ËÍÐÅÏ¢Á½¸ö¹¦ÄÜ£ºµ±½ÓÊÕµ½¿Í»§¶ËÇëÇóʱ£¬Ëü»áÀûÓà NetworkStream.BeginRead ¶ÁÈ¡¿Í»§¶ËÐÅÏ¢£¬²¢Ôڻص÷º¯ÊýReceiveAsyncCallbackÖÐÊä³öÐÅÏ¢ÄÚÈÝ£¬Èô½ÓÊÕµ½µÄÐÅÏ¢µÄ´óССÓÚ1ʱ£¬Ëü½«»áÅ׳öÒ»¸öÒì³£¡£µ±ÐÅÏ¢³É¹¦½ÓÊÕºó£¬ÔÙʹÓà NetworkStream.BeginWrite ·½·¨»ØÀ¡ÐÅÏ¢µ½¿Í»§¶Ë¡£

class Program
    {
        static void Main(string[] args)
        {
            //ÉèÖÃCLRÏ̳߳Ø×î´óÏß³ÌÊý
            ThreadPool.SetMaxThreads(1000, 1000);
   
            //ĬÈϵØÖ·Îª127.0.0.1
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            TcpListener tcpListener = new TcpListener(ipAddress, 500);
            tcpListener.Start();
            
            //ÒÔÒ»¸öËÀÑ­»·À´ÊµÏÖ¼àÌý
            while (true)
            {   //µ÷ÓÃÒ»¸öChatClient¶ÔÏóÀ´ÊµÏÖ¼àÌý
                ChatClient chatClient = new ChatClient(tcpListener.AcceptTcpClient());    
            }
        }
    }

    public class ChatClient
    {
        static TcpClient tcpClient;
        static byte[] byteMessage;
        static string clientEndPoint;

        public ChatClient(TcpClient tcpClient1)
        {
            tcpClient = tcpClient1;
            byteMessage = new byte[tcpClient.ReceiveBufferSize];
           
            //ÏÔʾ¿Í»§¶ËÐÅÏ¢
            clientEndPoint = tcpClient.Client.RemoteEndPoint.ToString();
            Console.WriteLine("Client's endpoint is " + clientEndPoint);
            
            //ʹÓÃNetworkStream.BeginReadÒì²½¶ÁÈ¡ÐÅÏ¢
            NetworkStream networkStream = tcpClient.GetStream();
            networkStream.BeginRead(byteMessage, 0, tcpClient.ReceiveBufferSize,
                                         new AsyncCallback(ReceiveAsyncCallback), null);
        }

        public void ReceiveAsyncCallback(IAsyncResult iAsyncResult)
        {
            //ÏÔʾCLRÏ̳߳Ø×´Ì¬
            Thread.Sleep(100);
            ThreadPoolMessage("\nMessage is receiving");

            //ʹÓÃNetworkStream.EndRead½áÊøÒì²½¶ÁÈ¡
            NetworkStream networkStreamRead = tcpClient.GetStream();
            int length=networkStreamRead.EndRead(iAsyncResult);

            //Èç¹û½ÓÊÕµ½µÄÊý¾Ý³¤¶ÈÉÙÓÚ1ÔòÅ׳öÒì³£
            if (length < 1)
            {
                tcpClient.GetStream().Close();
                throw new Exception("Disconnection!");
            }

            //ÏÔʾ½ÓÊÕÐÅÏ¢
            string message = Encoding.UTF8.GetString(byteMessage, 0, length);
            Console.WriteLine("Message:" + message);

            //ʹÓÃNetworkStream.BeginWriteÒì²½·¢ËÍÐÅÏ¢
            byte[] sendMessage = Encoding.UTF8.GetBytes("Message is received!");
            NetworkStream networkStreamWrite=tcpClient.GetStream();
            networkStreamWrite.BeginWrite(sendMessage, 0, sendMessage.Length, 
                                            new AsyncCallback(SendAsyncCallback), null);
        }

        //°ÑÐÅϢת»»³É¶þ½øÖÆÊý¾Ý£¬È»ºó·¢Ë͵½¿Í»§¶Ë
        public void SendAsyncCallback(IAsyncResult iAsyncResult)
        {
            //ÏÔʾCLRÏ̳߳Ø×´Ì¬
            Thread.Sleep(100);
            ThreadPoolMessage("\nMessage is sending");

            //ʹÓÃNetworkStream.EndWrite½áÊøÒì²½·¢ËÍ
            tcpClient.GetStream().EndWrite(iAsyncResult);

            //ÖØÐ¼àÌý
            tcpClient.GetStream().BeginRead(byteMessage, 0, tcpClient.ReceiveBufferSize,
                                               new AsyncCallback(ReceiveAsyncCallback), null);
        }

        //ÏÔʾÏ̳߳ØÏÖ×´
        static void ThreadPoolMessage(string data)
        {
            int a, b;
            ThreadPool.GetAvailableThreads(out a, out b);
            string message = string.Format("{0}\n  CurrentThreadId is {1}\n  " +
                  "WorkerThreads is:{2}  CompletionPortThreads is :{3}\n",
                  data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());

            Console.WriteLine(message);
        }
    }

¶øÔÚ¿Í»§¶ËÖ»ÊÇʹÓüòµ¥µÄ¿ª·¢·½Ê½£¬ÀûÓÃTcpClientÁ¬½Óµ½·þÎñÆ÷¶Ë£¬È»ºóµ÷ÓÃNetworkStream.Write·½·¨·¢ËÍÐÅÏ¢£¬×îºóµ÷ÓÃNetworkStream.Read·½·¨¶ÁÈ¡»ØÀ¡ÐÅÏ¢

static void Main(string[] args)
        {
            //Á¬½Ó·þÎñ¶Ë
            TcpClient tcpClient = new TcpClient("127.0.0.1", 500);

            //·¢ËÍÐÅÏ¢
            NetworkStream networkStream = tcpClient.GetStream();
            byte[] sendMessage = Encoding.UTF8.GetBytes("Client request connection!");
            networkStream.Write(sendMessage, 0, sendMessage.Length);
            networkStream.Flush();

            //½ÓÊÕÐÅÏ¢
            byte[] receiveMessage=new byte[1024];
            int count=networkStream.Read(receiveMessage, 0,1024);
            Console.WriteLine(Encoding.UTF8.GetString(receiveMessage));
            Console.ReadKey();
        }

×¢Òâ¹Û²ìÔËÐнá¹û£¬·þÎñÆ÷¶ËµÄÒì²½²Ù×÷Ï̶߳¼ÊÇÀ´×ÔÓÚCLRÏ̳߳صÄI/OÏß³Ì

5.3 Òì²½WebRequest

System.Net.WebRequest ÊÇ .NET ΪʵÏÖ·ÃÎÊ Internet µÄ ¡°ÇëÇó/ÏìӦģÐÍ¡± ¶ø¿ª·¢µÄÒ»¸ö abstract »ùÀ࣬ ËüÖ÷ÒªÓÐÈý¸ö×ÓÀࣺFtpWebRequest¡¢HttpWebRequest¡¢FileWebRequest¡£µ±Ê¹ÓÃWebRequest.Create£¨string uri£©´´½¨¶ÔÏóʱ£¬Ó¦ÓóÌÐò¾Í¿ÉÒÔ¸ù¾ÝÇëÇóЭÒéÅжÏʵÏÖÀàÀ´½øÐвÙ×÷¡£FileWebRequest¡¢FtpWebRequest¡¢HttpWebRequest ¸÷ÓÐÆä×÷ÓãºFileWebRequest ʹÓà ¡°file://·¾¶¡± µÄURI·½Ê½ÊµÏÖ¶Ô±¾µØ×ÊÔ´ºÍÄÚ²¿ÎļþµÄÇëÇó/ÏìÓ¦¡¢FtpWebRequest ʹÓÃFTPÎļþ´«ÊäЭÒéʵÏÖÎļþÇëÇó/ÏìÓ¦¡¢HttpWebRequest ÓÃÓÚ´¦ÀíHTTPµÄÒ³ÃæÇëÇó/ÏìÓ¦¡£ÓÉÓÚʹÓ÷½·¨ÏàÀàËÆ£¬ÏÂÃæ¾ÍÒÔ³£ÓõÄHttpWebRequestΪÀý×Ó½éÉÜÒ»ÏÂÒì²½WebRequestµÄʹÓ÷½·¨¡£

ÔÚʹÓÃASP.NET¿ª·¢ÍøÕ¾µÄʱºò£¬ÍùÍù»áºöÂÔÁËHttpWebRequestµÄʹÓã¬ÒòΪ¿ª·¢¶¼¼ÙÉè¿Í»§¶ËÊÇʹÓÃä¯ÀÀÆ÷µÈ¹¤¾ßÈ¥ÔĶÁÒ³ÃæµÄ¡£µ«Èç¹ûÄã¶ÔREST¿ª·¢·½Ê½ÓÐËùÁ˽⣬ÄÇ¶Ô HttpWebRequest ¾ÍÓ¦¸Ã·Ç³£ÊìϤ¡£Ëü¿ÉÒÔÔÚ·¾¶²ÎÊý¡¢Í·Îļþ¡¢Ò³ÃæÖ÷Ìå¡¢Cookie µÈ¶à´¦µØ·½¼ÓÈëÇëÇóÌõ¼þ£¬È»ºó¶Ô»Ø¸´Êý¾Ý½øÐÐÊʵ±´¦Àí¡£HttpWebRequest °üº¬ÓÐÒÔϼ¸¸ö³£Ó÷½·¨ÓÃÓÚ´¦ÀíÇëÇó/ÏìÓ¦£º

public override Stream GetRequestStream ()
public override WebResponse GetResponse ()

public override IAsyncResult BeginGetRequestStream ( AsyncCallback callback, Object state )
public override Stream EndGetRequestStream ( IAsyncResult asyncResult )
public override IAsyncResult BeginGetResponse ( AsyncCallback callback, Object state )
public override WebResponse EndGetResponse ( IAsyncResult asyncResult )

ÆäÖÐBeginGetRequestStream¡¢EndGetRequestStream ÓÃÓÚÒì²½ÏòHttpWebRequest¶ÔÏóдÈëÇëÇóÐÅÏ¢; BeginGetResponse¡¢EndGetResponse ÓÃÓÚÒì²½·¢ËÍÒ³ÃæÇëÇó²¢»ñÈ¡·µ»ØÐÅÏ¢¡£Ê¹ÓÃÒì²½·½Ê½²Ù×÷InternetµÄ¡°ÇëÇó/ÏìÓ¦¡±£¬±ÜÃâÖ÷Ï̳߳¤ÆÚ´¦Óڵȴý״̬£¬¶ø²Ù×÷ÆÚ¼äÒì²½Ïß³ÌÊÇÀ´×ÔCLRÏ̳߳صÄI/OÏ̡߳£

×¢Ò⣺ÇëÇóÓëÏìÓ¦²»ÄÜʹÓÃͬ²½ÓëÒì²½»ìºÏ¿ª·¢Ä£Ê½£¬¼´µ±ÇëÇóдÈëʹÓÃGetRequestStreamͬ²½Ä£Ê½£¬¼´Ê¹ÏìӦʹÓÃBeginGetResponseÒì²½·½·¨£¬²Ù×÷Ò²ÓëGetRequestStream·½·¨ÔÚÓÚͬһÏß³ÌÄÚ¡£

ÏÂÃæÒÔ¼òµ¥µÄÀý×Ó½éÉÜÒ»ÏÂÒì²½ÇëÇóµÄÓ÷¨¡£

Ê×ÏÈΪPersonÀà¼ÓÉÏ¿ÉÐòÁл¯ÌØÐÔ£¬ÔÚ·þÎñÆ÷¶Ë½¨Á¢Hanlder.ashx£¬Í¨¹ýRequest.InputStream »ñÈ¡µ½ÇëÇóÊý¾Ý²¢°ÑÊý¾Ýת»¯ÎªString¶ÔÏ󣬴ËʵÀýÖÐÊý¾ÝÊÇÒÔ ¡°Id£º1¡± µÄÐÎʽʵÏÖ´«Ë͵ġ£È»ºó¸ù¾ÝId²éÕÒ¶ÔÓ¦µÄPerson¶ÔÏ󣬲¢°ÑPerson¶ÔÏóдÈëResponse.OutStream Öзµ»¹µ½¿Í»§¶Ë¡£

ÔÚ¿Í»§¶ËÏ顄 HttpWebRequird.Method ÉèÖÃΪ "post"£¬Ê¹ÓÃÒì²½·½Ê½Í¨¹ýBeginGetRequireStream»ñÈ¡ÇëÇóÊý¾ÝÁ÷£¬È»ºóдÈëÇëÇóÊý¾Ý ¡°Id:1¡±¡£ÔÙʹÓÃÒì²½·½·¨BeginGetResponse »ñÈ¡»Ø¸´Êý¾Ý£¬×îºó°ÑÊý¾Ý·´ÐòÁл¯ÎªPerson¶ÔÏóÏÔʾ³öÀ´¡£

×¢Ò⣺HttpWebRequire.MethodĬÈÏΪget£¬ÔÚдÈëÇëÇóǰ±ØÐë°ÑHttpWebRequire.MethodÉèÖÃΪpost,·ñÔòÔÚʹÓÃBeginGetRequireStream »ñÈ¡ÇëÇóÊý¾ÝÁ÷µÄʱºò£¬ÏµÍ³¾Í»á·¢³ö ¡°ÎÞ·¨·¢Ë;ßÓдËν´ÊÀàÐ͵ÄÄÚÈÝÕýÎÄ" µÄÒì³£¡£

Model

namespace Model
{
    [Serializable]
    public class Person
    {
        public int ID
        {
            get;
            set;
        }
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
    }
}

·þÎñÆ÷¶Ë

public class Handler : IHttpHandler {

    public void ProcessRequest(HttpContext context)
    {
        //°ÑÐÅϢת»»ÎªString£¬ÕÒ³öÊäÈëÌõ¼þId
        byte[] bytes=new byte[1024];
        int length=context.Request.InputStream.Read(bytes,0,1024);
        string condition = Encoding.Default.GetString(bytes);
        int id = int.Parse(condition.Split(new string[] { ":" }, 
                           StringSplitOptions.RemoveEmptyEntries)[1]);
        
        //¸ù¾ÝId²éÕÒ¶ÔÓ¦Person¶ÔÏó
        var person = GetPersonList().Where(x => x.ID == id).First();
        
        //ËùPerson¸ñʽ»¯Îª¶þ½øÖÆÊý¾ÝдÈëOutputStream
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(context.Response.OutputStream, person);
    }

    //Ä£ÄâÔ´Êý¾Ý
    private IList GetPersonList()
    {
        var personList = new List();
        
        var person1 = new Person();
        person1.ID = 1;
        person1.Name = "Leslie";
        person1.Age = 30;
        personList.Add(person1);
        ...........
        return personList;
    }

    public bool IsReusable
    {
        get { return true;}
    }
}

¿Í»§¶Ë

class Program
    {
        static void Main(string[] args)
        {
            ThreadPool.SetMaxThreads(1000, 1000);
            Request();
            Console.ReadKey();
        }

        static void Request()
        {
            ThreadPoolMessage("Start"); 
            //ʹÓÃWebRequest.Create·½·¨½¨Á¢HttpWebRequest¶ÔÏó
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(
                                            "http://localhost:5700/Handler.ashx");
            webRequest.Method = "post";
           
            //¶ÔдÈëÊý¾ÝµÄRequestStream¶ÔÏó½øÐÐÒì²½ÇëÇó
            IAsyncResult result=webRequest.BeginGetRequestStream(
                new AsyncCallback(EndGetRequestStream),webRequest);
        }

        static void EndGetRequestStream(IAsyncResult result)
        {
            ThreadPoolMessage("RequestStream Complete");
            //»ñÈ¡RequestStream
            HttpWebRequest webRequest = (HttpWebRequest)result.AsyncState;
            Stream stream=webRequest.EndGetRequestStream(result);

            //дÈëÇëÇóÌõ¼þ
            byte[] condition = Encoding.Default.GetBytes("Id:1");
            stream.Write(condition, 0, condition.Length);

            //Òì²½½ÓÊջش«ÐÅÏ¢
            IAsyncResult responseResult = webRequest.BeginGetResponse(
                new AsyncCallback(EndGetResponse), webRequest);
        }

        static void EndGetResponse(IAsyncResult result)
        {
            //ÏÔ³öÏ̳߳ØÏÖ×´
            ThreadPoolMessage("GetResponse Complete");

            //½áÊøÒì²½ÇëÇ󣬻ñÈ¡½á¹û
            HttpWebRequest webRequest = (HttpWebRequest)result.AsyncState;
            WebResponse webResponse = webRequest.EndGetResponse(result);
            
            //°ÑÊä³ö½á¹ûת»¯ÎªPerson¶ÔÏó
            Stream stream = webResponse.GetResponseStream();
            BinaryFormatter formatter = new BinaryFormatter();
            var person=(Person)formatter.Deserialize(stream);
            Console.WriteLine(string.Format("Person    Id:{0} Name:{1} Age:{2}",
                person.ID, person.Name, person.Age));
        }

        //ÏÔʾÏ̳߳ØÏÖ×´
        static void ThreadPoolMessage(string data)
        {
            int a, b;
            ThreadPool.GetAvailableThreads(out a, out b);
            string message = string.Format("{0}\n  CurrentThreadId is {1}\n  " +
                  "WorkerThreads is:{2}  CompletionPortThreads is :{3}\n",
                  data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());

            Console.WriteLine(message);
        }
    }

´ÓÔËÐнá¹û¿ÉÒÔ¿´µ½£¬BeginGetRequireStream¡¢BeginGetResponse·½·¨ÊÇʹÓÃCLRÏ̳߳صÄI/OÏ̡߳£

5.4 Òì²½µ÷ÓÃWebService

Ïà±ÈTCP/IPÌ×½Ó×Ö£¬ÔÚʹÓÃWebServiceµÄʱºò£¬·þÎñÆ÷¶ËÐèÒª¸ü¸´ÔӵIJÙ×÷´¦Àí£¬Ê¹ÓÃʱ¼äÍùÍù»á¸ü³¤¡£ÎªÁ˱ÜÃâ¿Í»§¶Ë³¤ÆÚ´¦Óڵȴý״̬£¬ÔÚÅäÖ÷þÎñÒýÓÃʱѡÔñ ¡°Éú³ÉÒì²½²Ù×÷¡±£¬ÏµÍ³¿ÉÒÔ×Ô¶¯½¨Á¢Òì²½µ÷Óõķ½Ê½¡£

ÒÔ.NET 2.0ÒÔǰ£¬ÏµÍ³¶¼ÊÇʹÓÃASMXÀ´Éè¼ÆWebService£¬¶ø½üÄêÀ´WCF¿É˵ÊÇ»ðÈȵdz¡£¬ÏÂÃæ¾ÍÒÔWCFΪÀý×Ó¼òµ¥½éÉÜÒ»ÏÂÒì²½µ÷ÓÃWebServiceµÄÀý×Ó¡£

ÓÉÓÚϵͳ¿ÉÒÔ×Ô¶¯Éú³ÉÒì²½·½·¨£¬Ê¹ÓÃÆðÀ´·Ç³£¼òµ¥£¬Ê×ÏÈÔÚ·þÎñÆ÷¶Ë½¨Á¢·þÎñExampleService£¬ÀïÃæ°üº¬·½·¨Method¡£¿Í»§¶ËÒýÓô˷þÎñʱ£¬Ñ¡Ôñ ¡°Éú³ÉÒì²½²Ù×÷¡±¡£È»ºóʹÓà BeginMethod Æô¶¯Òì²½·½·¨£¬ Ôڻص÷º¯ÊýÖе÷ÓÃEndMethod½áÊøÒì²½µ÷Óá£

·þÎñ¶Ë

[ServiceContract]
public interface IExampleService
{
[OperationContract]
string Method(string name);
}

public class ExampleService : IExampleService
{
public string Method(string name)
{
return "Hello " + name;
}
}

class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(ExampleService));
host.Open();
Console.ReadKey();
host.Close();
}
}

<configuration>
<system.serviceModel>
<services>
<service name="Example.ExampleService">
<endpoint address="" binding="wsHttpBinding" contract="Example.IExampleService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:7200/Example/ExampleService/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

¿Í»§¶Ë

class Program
{
static void Main(string[] args)
{
//ÉèÖÃ×î´óÏß³ÌÊý
ThreadPool.SetMaxThreads(1000, 1000);
ThreadPoolMessage("Start");

//½¨Á¢·þÎñ¶ÔÏó£¬Òì²½µ÷Ó÷þÎñ·½·¨
ExampleServiceReference.ExampleServiceClient exampleService = new
ExampleServiceReference.ExampleServiceClient();
exampleService.BeginMethod("Leslie",new AsyncCallback(AsyncCallbackMethod),
exampleService);
Console.ReadKey();
}

static void AsyncCallbackMethod(IAsyncResult result)
{
Thread.Sleep(1000);
ThreadPoolMessage("Complete");
ExampleServiceReference.ExampleServiceClient example =
(ExampleServiceReference.ExampleServiceClient)result.AsyncState;
string data=example.EndMethod(result);
Console.WriteLine(data);
}

//ÏÔʾÏ̳߳ØÏÖ×´
static void ThreadPoolMessage(string data)
{
int a, b;
ThreadPool.GetAvailableThreads(out a, out b);
string message = string.Format("{0}\n CurrentThreadId is {1}\n " +
"WorkerThreads is:{2} CompletionPortThreads is :{3}\n",
data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());

Console.WriteLine(message);
}
}

<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IExampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8"
useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:7200/Example/ExampleService/"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IExampleService"
contract="ExampleServiceReference.IExampleService"
name="WSHttpBinding_IExampleService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>

×¢Òâ¹Û²ìÔËÐнá¹û£¬Òì²½µ÷Ó÷þÎñʱ£¬»Øµ÷º¯Êý¶¼ÊÇÔËÐÐÓÚCLRÏ̳߳صÄI/OÏ̵߳±ÖС£

Áù¡¢Òì²½ SqlCommand

´ÓADO.NET 2.0¿ªÊ¼£¬SqlCommand¾ÍÐÂÔöÁ˼¸¸öÒì²½·½·¨Ö´ÐÐSQLÃüÁî¡£Ïà¶ÔÓÚͬ²½Ö´Ðз½Ê½£¬ËüʹÖ÷Ï̲߳»ÐèÒªµÈ´ýÊý¾Ý¿âµÄ·µ»Ø½á¹û£¬ÔÚʹÓø´ÔÓÐÔ²éѯ»òÅúÁ¿²åÈëʱ½«ÓÐЧÌá¸ßÖ÷Ï̵߳ÄЧÂÊ¡£Ê¹ÓÃÒì²½SqlCommandµÄʱºò£¬Çë×¢Òâ°ÑConnectionString µÄ Asynchronous Processing ÉèÖÃΪ true ¡£

×¢Ò⣺SqlCommandÒì²½²Ù×÷µÄÌØ±ðÖ®´¦ÔÚÓÚÏ̲߳¢²»ÒÀÀµÓÚCLRÏ̳߳أ¬¶øÊÇÓÉWindowsÄÚ²¿Ìṩ£¬Õâ±ÈʹÓÃÒ첽ίÍиüÓÐЧÂÊ¡£µ«Èç¹ûÐèҪʹÓûص÷º¯ÊýµÄʱºò£¬»Øµ÷º¯ÊýµÄÏß³ÌÒÀÈ»ÊÇÀ´×ÔÓÚCLRÏ̳߳صŤ×÷ÕßÏ̡߳£

SqlCommandÓÐÒÔϼ¸¸ö·½·¨Ö§³ÖÒì²½²Ù×÷£º

public IAsyncResult BeginExecuteNonQuery (......)
public int EndExecuteNonQuery(IAsyncResult)

public IAsyncResult BeginExecuteReader(......)
public SqlDataReader EndExecuteReader(IAsyncResult)

public IAsyncResult BeginExecuteXmlReader (......)
public XmlReader EndExecuteXmlReader(IAsyncResult£©

ÓÉÓÚʹÓ÷½Ê½ÏàËÆ£¬´Ë´¦¾ÍÒÔ BeginExecuteNonQuery ΪÀý×Ó£¬½éÉÜÒ»ÏÂÒì²½SqlCommandµÄʹÓá£Ê×ÏȽ¨Á¢connectionString,×¢Òâ°ÑAsynchronous ProcessingÉèÖÃΪtrueÀ´Æô¶¯Òì²½ÃüÁȻºó°ÑSqlCommand.CommandTextÉèÖÃΪ WAITFOR DELAY "0:0:3" À´ÐéÄâÊý¾Ý¿â²Ù×÷¡£ÔÙͨ¹ýBeginExecuteNonQueryÆô¶¯Òì²½²Ù×÷£¬ÀûÓÃÂÖѯ·½Ê½¼à²â²Ù×÷Çé¿ö¡£×îºóÔÚ²Ù×÷Íê³ÉºóʹÓÃEndExecuteNonQueryÍê³ÉÒì²½²Ù×÷¡£

class Program
{
//°ÑAsynchronous ProcessingÉèÖÃΪtrue
static string connectionString = "Data Source=LESLIE-PC;Initial Catalog=Business;¡°+
"Integrated Security=True;Asynchronous Processing=true";

static void Main(string[] args)
{
//°ÑCLRÏ̳߳Ø×î´óÏß³ÌÊýÉèÖÃΪ1000
ThreadPool.SetMaxThreads(1000, 1000);
ThreadPoolMessage("Start");

//ʹÓÃWAITFOR DELAYÃüÁîÀ´ÐéÄâ²Ù×÷
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand("WAITFOR DELAY '0:0:3';", connection);
connection.Open();

//Æô¶¯Òì²½SqlCommand²Ù×÷£¬ÀûÓÃÂÖѯ·½Ê½¼à²â²Ù×÷
IAsyncResult result = command.BeginExecuteNonQuery();
ThreadPoolMessage("BeginRead");
while (!result.AsyncWaitHandle.WaitOne(500))
Console.WriteLine("Main thread do work........");

//½áÊøÒì²½SqlCommand
int count= command.EndExecuteNonQuery(result);
ThreadPoolMessage("\nCompleted");
Console.ReadKey();
}

//ÏÔʾÏ̳߳ØÏÖ×´
static void ThreadPoolMessage(string data)
{
int a, b;
ThreadPool.GetAvailableThreads(out a, out b);
string message = string.Format("{0}\n CurrentThreadId is {1}\n "+
"WorkerThreads is:{2} CompletionPortThreads is :{3}\n",
data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());
Console.WriteLine(message);
}
}

×¢ÒâÔËÐнá¹û£¬SqlCommandµÄÒì²½Ö´ÐÐÏ̲߳¢²»ÊôÓÚCLRÏ̳߳ء£

Èç¹û¾õµÃʹÓÃÂÖѯ·½Ê½¹ýÓÚÂé·³£¬¿ÉÒÔʹÓûص÷º¯Êý£¬µ«Òª×¢Òâµ±µ÷Óûص÷º¯Êýʱ£¬Ïß³ÌÊÇÀ´×ÔÓÚCLRÏ̳߳صŤ×÷ÕßÏ̡߳£

class Program
{
//°ÑAsynchronous ProcessingÉèÖÃΪtrue
static string connectionString = "Data Source=LESLIE-PC;Initial Catalog=Business;¡±+
¡°Integrated Security=True;Asynchronous Processing=true";
static void Main(string[] args)
{
//°ÑCLRÏ̳߳Ø×î´óÏß³ÌÊýÉèÖÃΪ1000
ThreadPool.SetMaxThreads(1000, 1000);
ThreadPoolMessage("Start");

//ʹÓÃWAITFOR DELAYÃüÁîÀ´ÐéÄâ²Ù×÷
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand("WAITFOR DELAY '0:0:3';", connection);
connection.Open();

//Æô¶¯Òì²½SqlCommand²Ù×÷£¬²¢°ÑSqlCommand¶ÔÏ󴫵ݵ½»Øµ÷º¯Êý
IAsyncResult result = command.BeginExecuteNonQuery(
new AsyncCallback(AsyncCallbackMethod),command);
Console.ReadKey();
}

static void AsyncCallbackMethod(IAsyncResult result)
{
Thread.Sleep(200);
ThreadPoolMessage("AsyncCallback");
SqlCommand command = (SqlCommand)result.AsyncState;
int count=command.EndExecuteNonQuery(result);
command.Connection.Close();
}

//ÏÔʾÏ̳߳ØÏÖ×´
static void ThreadPoolMessage(string data)
{
int a, b;
ThreadPool.GetAvailableThreads(out a, out b);
string message = string.Format("{0}\n CurrentThreadId is {1}\n "+
"WorkerThreads is:{2} CompletionPortThreads is :{3}\n",
data, Thread.CurrentThread.ManagedThreadId, a.ToString(), b.ToString());

Console.WriteLine(message);
}
}

ÔËÐнá¹û£º

   
4185 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ʹÓÃdecj¼ò»¯Webǰ¶Ë¿ª·¢
Web¿ª·¢¿ò¼ÜÐγÉÖ®ÂÃ
¸üÓÐЧÂʵÄʹÓÃVisual Studio
MVP+WCF+Èý²ã½á¹¹´î½¨¿ò¼Ü
ASP.NETÔËÐлúÖÆÇ³Îö¡¾Í¼½â¡¿
±àд¸üºÃµÄC#´úÂë
10¸öVisual Studio¿ª·¢µ÷ÊÔ¼¼ÇÉ


.NET¿ò¼ÜÓë·Ö²¼Ê½Ó¦Óüܹ¹Éè¼Æ
.NET & WPF & WCFÓ¦Óÿª·¢
UML&.Net¼Ü¹¹Éè¼Æ
COM×é¼þ¿ª·¢
.NetÓ¦Óÿª·¢
InstallShield


ÈÕÕÕ¸Û .NET Framework & WCFÓ¦Óÿª·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ
±±¾© .NetÓ¦ÓÃÈí¼þϵͳ¼Ü¹¹
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
ÈüÃÅÌú¿Ë C#Óë.NET¼Ü¹¹Éè¼Æ
¹ã¶«ºËµç .NetÓ¦ÓÃϵͳ¼Ü¹¹