ÒýÑÔ
±¾ÎÄÖ÷Òª´ÓÏ̵߳Ļù´¡Ó÷¨£¬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);
}
} |
ÔËÐнá¹û£º

|