成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#異步通信概念及應(yīng)用淺析

開發(fā) 后端
C#異步通信概念及應(yīng)用主要向你介紹了C#異步通信的實(shí)現(xiàn)方法和操作的具體的實(shí)現(xiàn)方法,希望對(duì)你理解和學(xué)習(xí)C#異步通信有所幫助。

C#異步通信概念及應(yīng)用的認(rèn)識(shí)首先讓我們來(lái)看看:在網(wǎng)絡(luò)編程中運(yùn)用Socket,常常需要長(zhǎng)期監(jiān)聽某個(gè)端口,以獲得Socket連接,進(jìn)而執(zhí)行相關(guān)操作。

但此時(shí),主線程就會(huì)被阻塞,無(wú)法做其他事情。為了解決這類問題,Socket類中提供了一些支持異步操作的方法,如表17-10所示。

下表為Socket類中支持異步操作的方法

   

   

BeginAccept()

開始一個(gè)異步請(qǐng)求,以創(chuàng)建一個(gè)新的Socket對(duì)象來(lái)接受傳入的連接請(qǐng)求

EndAccept()

結(jié)束一個(gè)異步請(qǐng)求,以創(chuàng)建一個(gè)新的Socket對(duì)象來(lái)接受傳入的連接請(qǐng)求

BeginConnect()

開始一個(gè)對(duì)遠(yuǎn)程主機(jī)的異步請(qǐng)求

EndConnect()

結(jié)束一個(gè)對(duì)遠(yuǎn)程主機(jī)的異步請(qǐng)求

BeginDisconnect()

開始異步請(qǐng)求從遠(yuǎn)程主機(jī)斷開連接

EndDisconnect()

結(jié)束從遠(yuǎn)程主機(jī)斷開連接的異步請(qǐng)求

BeginReceive()

開始從連接的Socket中異步接收數(shù)據(jù)

EndReceive()

結(jié)束從連接的Socket中異步接收數(shù)據(jù)

BeginReceiveFrom()

開始從指定網(wǎng)絡(luò)設(shè)備中異步接收數(shù)據(jù)

EndReceiveFrom()

結(jié)束從指定網(wǎng)絡(luò)設(shè)備中異步接收數(shù)據(jù)

BeginSend()

開始將數(shù)據(jù)異步發(fā)送到連接的Socket

EndSend()

結(jié)束數(shù)據(jù)的異步發(fā)送

BeginSendFile()

開始將文件異步發(fā)送到連接的Socket

EndSendFile()

結(jié)束文件的異步發(fā)送

BeginSendTo()

向特定的遠(yuǎn)程主機(jī)異步發(fā)送數(shù)據(jù)

EndSendTo()

結(jié)束對(duì)遠(yuǎn)程主機(jī)數(shù)據(jù)的異步發(fā)送

從上表中可以看出,這些方法都是成對(duì)出現(xiàn)的。這些方法能避免網(wǎng)絡(luò)通信中的阻塞現(xiàn)象。這些方法的使用機(jī)制是在Begin開頭的方法中注冊(cè)一個(gè)回調(diào)函數(shù),當(dāng)對(duì)應(yīng)的事件發(fā)生時(shí),調(diào)用該回調(diào)函數(shù),且在回調(diào)函數(shù)中調(diào)用對(duì)應(yīng)的End開頭的方法。

下面以BeginAccept()和EndAccept()為例,說明異步方法的用法。BeginAccept()的聲明如下所示。

  1. public IAsyncResult BeginAccept(AsynCallback callback,  
  2. object state); 

其中,***個(gè)參數(shù)是異步委托AsynCallb了ack,state包含此請(qǐng)求的狀態(tài)信息的對(duì)象。

EndAccept()方法具有三種重載形式,如下所示。

  1. public Socket EndAccept(IAsyncResult asynresult);  
  2.  
  3. public Socket EndAccept(out byte[] buffer,  
  4. IAsyncResult asynresult);  
  5.  
  6. public Socket EndAccept(out byte[] buffer,  
  7. out int bytesTransferred, IAsyncResult asynresult,);  

asynresult用于存儲(chǔ)此異步操作的狀態(tài)信息及任何用戶定義的數(shù)據(jù);buffer表示需要傳輸?shù)淖止?jié)數(shù)據(jù);

bytesTransferred表示已經(jīng)傳輸?shù)淖止?jié)數(shù)。這里的out參數(shù)與ref的用法類似,均表示傳遞引用。它們的區(qū)別是ref是傳遞參數(shù)的地址,out是返回值。

具體用法如下所示。

  1. private AsyncCallback callbackOnAccpt; //定制回調(diào)方法  
  2.  
  3. private Socket s;  
  4.  
  5. ……  //C#異步通信
  6.  
  7. s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);  
  8.  
  9. callbackAccpt = new AsyncCallback(this.OnAccept);//實(shí)例化回調(diào)方法  
  10.  
  11. s.BeginAccept(callbackOnAccpt, this.s); //開始異步請(qǐng)求  
  12.  
  13. ……  
  14.  
  15. private void OnAccept(IAsyncResult asynresult)  
  16.  
  17. {  
  18.  //C#異步通信
  19. ……  
  20.  
  21. s.EndAccept(asynresult); //結(jié)束異步請(qǐng)求  
  22.  
  23. ……  
  24.  
  25. }  

BeginConnect()和EndConnect()用于對(duì)遠(yuǎn)程主機(jī)的異步連接請(qǐng)求。BeginConnect()的聲明如下所示。

  1. public IAsyncResult BeginConnect(EndPoint remoteEP,  
  2. AsyncCallback callback, object state);  
  3.  
  4. public IAsyncResult BeginConnect(IPAddress address,  
  5. int port,AsyncCallback requestedcallback,object state);  
  6.  
  7. public IAsyncResult BeginConnect(IPAddress[] address,  
  8. int port,AsyncCallback requestedcallback,object state);  
  9.  //C#異步通信
  10. public IAsyncResult BeginConnect(string host,int port,  
  11. AsyncCallback requestedcallback,object state);  

它的每個(gè)重載形式均含有AsyncCallback參數(shù),這是這類Begin開頭的方法的特點(diǎn);remoteEP表示遠(yuǎn)程主機(jī)的IP和端口。

EndConnect()的聲明如下所示。

public Socket EndConnect(IAsyncResult asynresult);

它的參數(shù)的意義和EndAccept()完全一致。

BeginSend()表示開始將數(shù)據(jù)異步發(fā)送到連接的Socket,它最常用的聲明如下所示。

  1. public IAsyncResult BeginSend(byte[] buffer,  
  2. int offset,int size,SocketFlags socketFlags,  
  3.  
  4. AsyncCallback callback,object state);  

Buffer表示要發(fā)送的數(shù)據(jù),offset表示buffer中發(fā)送數(shù)據(jù)的位置,size為發(fā)送字節(jié)數(shù)的大小,socketFlags指SocketFlags值的按位組合。

EndSend()的聲明如下所示。

  1. public Socket EndSend(IAsyncResult asynresult); 

BeginReceive()表示開始從連接的Socket中異步接收數(shù)據(jù),它的常見聲明如下所示。

  1. public IAsyncResult BeginReceive(byte[] buffer,  
  2. int offset,int size,SocketFlags socketFlags,  
  3.  
  4. AsyncCallback callback,object state); 

它的參數(shù)和BeginSend()是完全一致的,這里不再贅述。

EndReceive()的聲明如下所示。

  1. public Socket EndReceive(IAsyncResult asynresult); 

C#異步通信之Socket中異步通信的實(shí)現(xiàn)要遠(yuǎn)比同步困難,這里不再舉例。簡(jiǎn)單地說,在同步中,主線程如果調(diào)用一個(gè)方法,那么主線程必須等到方法線程執(zhí)行完才能繼續(xù)往下執(zhí)行。因此,主線程和方法線程的執(zhí)行是串行的。而在異步中,兩者能同時(shí)執(zhí)行,它們的執(zhí)行是并行的。

C#異步通信的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#異步通信有所幫助。

【編輯推薦】

  1. C# Socket異步通訊實(shí)現(xiàn)詳解
  2. C#異步編程模式IAsyncResult淺析
  3. 基于事件的C#異步編程模式淺析
  4. 對(duì)委托在C#異步委托和多線程中的理解
  5. C#異步委托之委托使用的時(shí)機(jī)淺析
責(zé)任編輯:仲衡 來(lái)源: 百度空間
相關(guān)推薦

2009-08-18 09:51:18

C#枚舉類型

2009-08-24 17:39:21

C# 泛型集合

2009-09-09 16:46:59

C# XmlSeria

2009-08-24 15:28:19

C# 泛型方法

2009-08-20 19:08:30

C#異步調(diào)用

2009-09-01 16:10:28

C#單元測(cè)試

2009-08-27 10:20:03

C# foreach語(yǔ)

2009-08-17 13:34:02

C#異步操作

2009-09-04 16:37:37

C# DES算法

2009-08-28 16:48:50

C#多態(tài)性

2009-08-12 10:37:13

C#運(yùn)算符重載

2009-07-31 09:32:04

ASP.NET緩存概念ASP.NET緩存應(yīng)用

2009-09-14 13:44:14

Lambda ExprC# Lambda

2009-08-25 18:16:02

.NET Framew.NET Framew

2009-09-02 10:58:02

C#動(dòng)態(tài)數(shù)組

2009-08-27 17:11:44

C# Fluent I

2009-08-21 09:20:44

C#異步套接字

2009-08-20 17:30:56

C#異步編程模式

2010-02-03 16:29:19

C++ sizeof

2009-09-11 11:16:53

C# Attribut
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久成人精品一区二区三区 | 啪啪毛片 | 日韩一区二区三区在线 | 亚洲精品乱码久久久久v最新版 | 日韩成人在线看 | 99热精品国产 | 成人妇女免费播放久久久 | 国产一区二区三区四区五区加勒比 | 色狠狠桃花综合 | 国产精品区二区三区日本 | 99伊人| 一级毛片色一级 | 亚洲精品第一 | 国产永久免费 | 久草热播| 国产成人在线看 | 91精品久久久 | 作爱视频免费看 | 日韩av一区二区在线观看 | 日本一区二区高清不卡 | 日韩欧美第一页 | 欧美一级网站 | 亚洲国产高清免费 | 欧美一级久久 | 欧美精品在线一区二区三区 | 国产成在线观看免费视频 | 男女视频91| 亚洲成人国产 | 久久久久久久一区 | 国产精品精品视频一区二区三区 | 99精品视频免费观看 | 欧美高清一级片 | 色爱综合网 | 亚洲综合在线播放 | 亚洲激情一区二区 | 午夜免费在线观看 | 精品欧美一区二区三区久久久 | 九九综合 | 一区免费看 | 精品久久久久久久久久久久 | 在线视频国产一区 |