以socket通信中的異步方法為例:
public static manualresetevent connectdone = new manualresetevent(false);
public static void connectcallback(iasyncresult ar)
{
socket sclient = (socket)ar.asyncstate;
sclient.endconnect(ar);
console.writeline("socket connected to {0}", sclient.remoteendpoint.tostring());
connectdone.set();
}
public static void main(string[] arg)
{
try
{
iphostentry iphost = dns.resolve("127.0.0.1");
ipaddress ipaddr = iphost.addresslist[0];
ipendpoint endpoint = new ipendpoint(ipaddr, 11000);
socket sclient = new socket(addressfamily.internetwork,
sockettype.stream, protocoltype.tcp);
client.beginconnect(endpoint, new asynccallback(connectcallback),sclient);
for (int i = 0; i <5; i++)
console.writeline("do some other work.");
byte[] bytedata = encoding.ascii.getbytes("some data.");
connectdone.waitone();
sclient.beginsend(bytedata, 0, bytedata.length, 0,
new asynccallback(sendcallback), sclient);
………
}
(注:manualresetevent 允許線程通過發(fā)信號互相通信。通常,此通信涉及一個線程在其他線程進行之前必須完成的任務。
manualresetevent就像一個信號燈,可以利用它的信號來通知其它線程。它有幾個重要的方法:reset(),set(),waitone()。初始化該對象時,用戶可以指定其默認的狀態(tài)(有信號/無信號),在初始化以后,該對象將保持原來的狀態(tài)不變直到它的reset()或者set()方法被調(diào)用,reset()方法將其設置為無信號狀態(tài),set()方法將其設置為有信號狀態(tài)。waitone()方法使當前線程掛起直到manualresetevent對象處于有信號狀態(tài),此時該線程將被激活。)
本例中,主線程調(diào)用connectdone.waitone();后,主線程阻塞,直到連接操作(即connectcallback)完成,因為連接操作完成之后,執(zhí)行了connectdone.set()將信號燈設置為有信號,由于調(diào)用了manualresetevent.waitone()方法而處在等待狀態(tài)的主線程將接收到這個信號,于是它接著往下執(zhí)行,完成后邊的工作。
同步與異步:
簡單地說,同步即程序執(zhí)行一個方法,等該方法返回之后,繼續(xù)往下走,
異步:即程序調(diào)用一個方法后立即返回,“宏觀”而言,主線程與方法線程并行執(zhí)行。
就本例而言,socket的異步方法beginconnect被調(diào)用后,接著執(zhí)行主線程中該語句之后的代碼,即:
for (int i = 0; i <5; i++)
console.writeline("do some other work.");
byte[] bytedata = encoding.ascii.getbytes("some data.");
如果調(diào)用的是同步方法,那么,輸出“socket connected to…”一定會在“do some other work.”之前,因為主線程必須等待同步方法的返回,但是在異步的情況下,將可能在5行“do some other work.”之間的某個時刻出現(xiàn)“socket connected to…”的輸出(實際情況還依賴于操作系統(tǒng)的線程調(diào)度)。
至于在sclient.beginsend(…)方法之前調(diào)用connectdone.waitone(),則是由于前者依賴于連接操作(即connectcallback)的完成,須得同步一下。
新聞熱點
疑難解答
圖片精選