国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET關于同步、異步及Socket

2024-07-10 13:09:55
字體:
來源:轉載
供稿:網(wǎng)友
  • 本文來源于網(wǎng)頁設計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • 以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)的完成,須得同步一下。

    發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 城口县| 闽清县| 浪卡子县| 秦安县| 房山区| 花莲县| 临潭县| 新兴县| 温州市| 邻水| 兴义市| 珲春市| 永城市| 宁陕县| 仁布县| 永新县| 来凤县| 新蔡县| 林西县| 隆尧县| 宕昌县| 遂川县| 隆林| 齐河县| 沁水县| 安多县| 德化县| 五河县| 阿荣旗| 四平市| 伊春市| 香河县| 上栗县| 黔南| 桃源县| 志丹县| 萝北县| 寿宁县| 澄迈县| 南投市| 平安县|