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

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

c#使用委托實(shí)現(xiàn)異步調(diào)用

2024-07-21 02:26:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • 網(wǎng)站運(yùn)營(yíng)seo文章大全
  • 提供全面的站長(zhǎng)運(yùn)營(yíng)經(jīng)驗(yàn)及seo技術(shù)!
  • 異步編程是受公共語(yǔ)言運(yùn)行庫(kù)的許多領(lǐng)域(如遠(yuǎn)程處理、asp.net 和 windows 窗體)支持的功能。異步編程是 .net framework 中的核心概念。使用 .net 異步編程,在程序繼續(xù)執(zhí)行的同時(shí)對(duì) .net 類(lèi)方法進(jìn)行調(diào)用,直到進(jìn)行指定的回調(diào)為止;或者如果沒(méi)有提供回調(diào),則直到對(duì)調(diào)用的阻塞、輪詢(xún)或等待完成為止。

    異步編程是由 .net framework 的許多區(qū)域支持的功能,這些區(qū)域包括:

    文件 io、流 io、套接字 io
    網(wǎng)絡(luò):http、tcp
    遠(yuǎn)程處理信道(http、tcp)和代理
    使用 asp.net 創(chuàng)建的 xml web services
    asp.net web 窗體
    使用 messagequeue 類(lèi)的消息隊(duì)列
    異步委托
    .net framework 允許異步調(diào)用任何方法。定義與需要調(diào)用的方法具有相同簽名的委托;公共語(yǔ)言運(yùn)行庫(kù)將自動(dòng)為該委托定義具有適當(dāng)簽名的 begininvoke 和 endinvoke 方法。

    begininvoke 方法用于啟動(dòng)異步調(diào)用。它與需要異步執(zhí)行的方法具有相同的參數(shù),只不過(guò)還有兩個(gè)額外的參數(shù)(將在稍后描述)。begininvoke 立即返回,不等待異步調(diào)用完成。begininvoke 返回 iasyncresult,可用于監(jiān)視調(diào)用進(jìn)度。
    endinvoke 方法用于檢索異步調(diào)用結(jié)果。調(diào)用 begininvoke 后可隨時(shí)調(diào)用 endinvoke 方法;如果異步調(diào)用未完成,endinvoke 將一直阻塞到異步調(diào)用完成。endinvoke 的參數(shù)包括需要異步執(zhí)行的方法的 out 和 ref 參數(shù)以及由 begininvoke 返回的 iasyncresult。
    調(diào)用了 begininvoke 后,可以:

    進(jìn)行某些操作,然后調(diào)用 endinvoke 一直阻塞到調(diào)用完成。
    使用 iasyncresult.asyncwaithandle 獲取 waithandle,使用它的 waitone 方法將執(zhí)行一直阻塞到發(fā)出 waithandle 信號(hào),然后調(diào)用 endinvoke。
    輪詢(xún)由 begininvoke 返回的 iasyncresult,確定異步調(diào)用何時(shí)完成,然后調(diào)用 endinvoke。
    將用于回調(diào)方法的委托傳遞給 begininvoke。該方法在異步調(diào)用完成后在 threadpool 線程上執(zhí)行,它可以調(diào)用 endinvoke。  
    下面是一個(gè)使用委托調(diào)用異步方法的例子。實(shí)例中首先定義了一個(gè)adddelegate類(lèi)型委托add,并將方法add綁定到委托實(shí)例上。然后定義了iasyncresult接口類(lèi)型實(shí)例iar并調(diào)用委托add的begininvoke方法用于啟動(dòng)異步調(diào)用。由于異步調(diào)用完成時(shí)會(huì)發(fā)出 waithandle 信號(hào),因此可以通過(guò)iar.asyncwaithandle.waitone();來(lái)等待它,在這期間主程序可以執(zhí)行一些其他的任務(wù)以達(dá)到程序異步執(zhí)行的效果。最后調(diào)用endinvoke 方法用于檢索異步調(diào)用結(jié)果。值得注意的是如果異步調(diào)用未完成,endinvoke 將一直阻塞到異步調(diào)用完成。

     

    using system;
    using system.threading;

    //使用委托調(diào)用異步方法的例子
    namespace delegatecallasynchronousmethods
    ...{

        class asyncdelegatesblocked
        ...{
            public static int add(int op1, int op2, out int result)
            ...{
                thread.sleep(3000); // simulating work
                return (result = op1 + op2);
            }
            public delegate int adddelegate(int op1, int op2,
                out int result);//聲明adddelegate委托

            static void main()
            ...{
                int result;
                /**//*定義一個(gè)adddelegate類(lèi)型委托add,將方法add綁定到委托實(shí)例上*/
                adddelegate add = new adddelegate(add);

                console.writeline("[main] invoking the asynchronous " +
                    "add method");

                /**//*begininvoke 方法用于啟動(dòng)異步調(diào)用。它與您需要異步執(zhí)行的方法具有相同的參數(shù),還有兩個(gè)額外的參數(shù)
                 *begininvoke 立即返回,不等待異步調(diào)用完成。begininvoke 返回 iasyncresult,可用于監(jiān)視調(diào)用進(jìn)度。*/
               
                //定義iasyncresult接口類(lèi)型實(shí)例iar
                //6, 42, out result為異步執(zhí)行的方法的參數(shù)列表
                iasyncresult iar = add.begininvoke(6, 42, out result, 
                    null, null);

                // here we're simulating doing some work before
                // blocking on the add method's completion.
                console.write("[main] doing other work");
                for (int i = 0; i < 10; i++)
                ...{
                    thread.sleep(200);
                    console.write(".");
                }

                console.writeline(" [main] waiting for add to finish");
                /**//*使用 iasyncresult.asyncwaithandle 獲取 waithandle,
                 * 使用它的 waitone 方法將執(zhí)行一直阻塞到發(fā)出 waithandle 信號(hào),然后調(diào)用 endinvoke。
                 * 注意:異步調(diào)用完成時(shí)會(huì)發(fā)出 waithandle 信號(hào),可以通過(guò)waitone 來(lái)等待它*/
                iar.asyncwaithandle.waitone();

                console.writeline("[main] add finished, cleaning up");
                /**//*endinvoke 方法用于檢索異步調(diào)用結(jié)果。調(diào)用 begininvoke 后可隨時(shí)調(diào)用 endinvoke 方法;
                 * 如果異步調(diào)用未完成,endinvoke 將一直阻塞到異步調(diào)用完成。
                 * endinvoke 的參數(shù)包括所需要異步執(zhí)行的方法的 out 和 ref 參數(shù)以及由 begininvoke 返回的 iasyncresult。*/
                add.endinvoke(out result, iar);

                console.writeline("[main] the result is {0}", result);
                console.readline();
            }
        };

    }

    發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 瑞昌市| 勐海县| 自贡市| 孟州市| 鸡西市| 乐安县| 浦县| 阿城市| 剑河县| 海门市| 虞城县| 平凉市| 巴林右旗| 沁源县| 东港市| 安徽省| 兴山县| 米易县| 闸北区| 阿城市| 蒙自县| 重庆市| 封丘县| 津市市| 保定市| 姜堰市| 二连浩特市| 甘洛县| 万全县| 石首市| 宜丰县| 宁明县| 河北区| 肃宁县| 房山区| 乌兰县| 孟州市| 乌鲁木齐市| 闵行区| 威海市| 永胜县|