• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        .NET Delegates: A C# Bedtime Story中文版(下篇)轉

        .NET Delegates: A C# Bedtime Story中文版(下篇)轉

        更新時間:2022-05-10 文章作者:未知 信息來源:網絡 閱讀次數:

        作者:Chris Sells
        譯者:榮耀
        【譯注:C#進階文章。Chris Sells是《ATL Internals》一書作者之一。譯文中所有程
        序調試環境均為Microsoft Visual Studio.NET 7.0 Beta2和 Microsoft .NET Framewo
        rk SDK Beta2。代碼就是文章,請仔細閱讀代碼J】
        取得所有結果
         現在,peter終于松了一口氣。他已經設法滿足了所有的監聽者,而且不會和特定
        實現緊密耦合。然而,他又注意到盡管boss和universe都為工作打了分,但他只得到了
        一個打分。【譯注:請參見上節例子代碼及譯注】他希望能得到每一個監聽者的評分結
        果。因此,他決定提取委托調用列表,以便手工分別調用它們:
        public void DoWork()
        {
        //...
        Console.WriteLine("Worker: work completed");
         if( completed != null)
        {
        foreach( WorkCompleted wc in completed.GetInvocationList())
        {
        int grade = wc();
        Console.WriteLine("Worker grade= " + grade);
        }
        }
        }
        【譯注:以下是本節描述之完整代碼示例:
        using System;
        delegate void WorkStarted();
        delegate void WorkProgressing();
        delegate int WorkCompleted();
        class Worker
        {
         public void DoWork()
         {
        Console.WriteLine("Worker: work started");
        if( started != null ) started();
        Console.WriteLine("Worker: work progressing");
        if( progressing != null ) progressing();
        Console.WriteLine("Worker: work completed");
        if( completed != null)
        {
        foreach( WorkCompleted wc in completed.GetInvocationList())
        {
        int grade = wc();
        Console.WriteLine("Worker grade= " + grade);
        }
        }
         }
         public event WorkStarted started ;
         public event WorkProgressing progressing;
         public event WorkCompleted completed;
        }
        class Boss
        {
         public int WorkCompleted()
         {
        Console.WriteLine("Better...");
         return 4; /* out of 10 */
         }
        }
        class Universe
        {
         static void WorkerStartedWork()
         {
        Console.WriteLine("Universe notices worker starting work");
         }
         static int WorkerCompletedWork()
         {
        Console.WriteLine("Universe pleased with worker's work");
         return 7;
         }
         static void Main()
         {
         Worker peter = new Worker();
         Boss boss = new Boss();
        peter.completed += new WorkCompleted(boss.WorkCompleted);
        peter.started += new WorkStarted(Universe.WorkerStartedWork);
        peter.completed += new WorkCompleted(Universe.WorkerCompletedWork)
        ;
        peter.DoWork();
        Console.WriteLine("Main: worker completed work");
        Console.ReadLine();
         }
        }
        /*
        以下是上段程序輸出結果:
        Worker: work started
        Universe notices worker starting work
        Worker: work progressing
        Worker: work completed
        Better...
        Worker grade = 4 【譯注:boss打的4分也得到啦J】
        Universe pleased with worker's work
        Worker grade = 7
        Main: worker completed work
        */

        異步通知:觸發和忽略
        不料,boss和universe被別的什么事糾纏上了,這就意味著他們給peter打分的時間被延
        遲了:
        class Boss
        {
        public int WorkCompleted()
        {
        System.Threading.Thread.Sleep(3000);
         Console.WriteLine("Better...");
        return 6; /* out of 10 */
        }
        }
        class Universe
        {
        static int WorkerCompletedWork()
        {
        System.Threading.Thread.Sleep(4000);
        Console.WriteLine("Universe is pleased with worker's work");
        return 7;
        }
        //...
        }
        而不幸的是,由于peter是同時通知boss和universe并等待他們打分的,這些返回評分的
        通知現在看來要占用他不少工作時間,因此,peter決定忽略評分并且異步觸發事件:
        public void DoWork()
        {
        //...
        Console.WriteLine("Worker: work completed");
         if( completed != null )
        {
        foreach( WorkCompleted wc in completed.GetInvocationList())
        {
        wc.BeginInvoke(null, null);
        }
        }
        }
        【譯注:下面給出本節例子完整代碼:
        using System;
        delegate void WorkStarted();
        delegate void WorkProgressing();
        delegate int WorkCompleted();
        class Worker
        {
         public void DoWork()
         {
        Console.WriteLine("Worker: work started");
        if( started != null ) started();
        Console.WriteLine("Worker: work progressing");
        if( progressing != null ) progressing();
        Console.WriteLine("Worker: work completed");
        if( completed != null )
        {
        foreach( WorkCompleted wc in completed.GetInvocationList())
        {
        wc.BeginInvoke(null, null);
        }
        }
         }
         public event WorkStarted started ;
         public event WorkProgressing progressing;
         public event WorkCompleted completed;
        }
        class Boss
        {
        public int WorkCompleted()
        {
        System.Threading.Thread.Sleep(3000);
        Console.WriteLine("Better...");
        return 6; /* out of 10 */
        }
        }
        class Universe
        {
         static void WorkerStartedWork()
         {
        Console.WriteLine("Universe notices worker starting work");
         }
        static int WorkerCompletedWork()
        {
        System.Threading.Thread.Sleep(4000);
        Console.WriteLine("Universe is pleased with worker's work");
        return 7;
        }
         static void Main()
         {
         Worker peter = new Worker();
         Boss boss = new Boss();
        peter.completed += new WorkCompleted(boss.WorkCompleted);
        peter.started += new WorkStarted(Universe.WorkerStartedWork);
        peter.completed += new WorkCompleted(Universe.WorkerCompletedWork)
        ;
        peter.DoWork();
        Console.WriteLine("Main: worker completed work");
        Console.ReadLine();
         }
        }
        /*
        以下是上段程序輸出結果:
        Worker: work started
        Universe notices worker starting work
        Worker: work progressing
        Worker: work completed
        Main: worker completed work //【譯注:由于是異步觸發事件,因此這一行先輸出啦
        J】
        Better... //【譯注:評分已被忽略】
        Universe pleased with worker's work //【譯注:評分已被忽略】
        */

        異步通知:輪詢
         這就使得peter可以通知監聽者的同時自己也能立即返回工作,讓進程的線程池調
        用委托。然而不久他就發現監聽者對其工作的評分丟掉了。【譯注:請參見上節例子代
        碼及譯注】peter知道他做了一件明智的事并樂意universe作為一個整體(不單單是他的
        boss)評判他。因此,peter異步觸發事件,但定期輪詢,以察看可以獲得的評分:
        public void DoWork()
        {
        //...
        Console.WriteLine("Worker: work completed");
        if( completed != null )
        {
        foreach( WorkCompleted wc in completed.GetInvocationList() )
        {
        IAsyncResult res = wc.BeginInvoke(null, null);
        while( !res.IsCompleted ) System.Threading.Thread.Sleep(1);
        int grade = wc.EndInvoke(res);
        Console.WriteLine("Worker grade= " + grade);
        }
        }
        }
        【譯注:下面給出本節例子完整代碼:
        using System;
        delegate void WorkStarted();
        delegate void WorkProgressing();
        delegate int WorkCompleted();
        class Worker
        {
         public void DoWork()
         {
        Console.WriteLine("Worker: work started");
        if( started != null ) started();
        Console.WriteLine("Worker: work progressing");
        if( progressing != null ) progressing();
        Console.WriteLine("Worker: work completed");
        if( completed != null )
        {
        foreach( WorkCompleted wc in completed.GetInvocationList() )
        {
        IAsyncResult res = wc.BeginInvoke(null, null);
        while( !res.IsCompleted ) System.Threading.Thread.Sleep(1);
        int grade = wc.EndInvoke(res);
        Console.WriteLine("Worker grade= " + grade);
        }
        }
         }
         public event WorkStarted started ;
         public event WorkProgressing progressing;
         public event WorkCompleted completed;
        }
        class Boss
        {
         public int WorkCompleted()
         {
        System.Threading.Thread.Sleep(3000);
        Console.WriteLine("Better...");
         return 6; /* out of 10 */
         }
        }
        class Universe
        {
         static void WorkerStartedWork()
         {
        Console.WriteLine("Universe notices worker starting work");
         }
         static int WorkerCompletedWork()
         {
        System.Threading.Thread.Sleep(4000);
        Console.WriteLine("Universe is pleased with worker's work");
         return 7;
         }
         static void Main()
         {
         Worker peter = new Worker();
         Boss boss = new Boss();
        peter.completed += new WorkCompleted(boss.WorkCompleted);
        peter.started += new WorkStarted(Universe.WorkerStartedWork);
        peter.completed += new WorkCompleted(Universe.WorkerCompletedWork)
        ;
        peter.DoWork();
        Console.WriteLine("Main: worker completed work");
        Console.ReadLine();
         }
        }
        /*
        以下是上段程序輸出結果:
        Worker: work started
        Universe notices worker starting work
        Worker: work progressing
        Worker: work completed
        Better...
        Worker grade = 6
        Universe pleased with worker's work
        Worker grade = 7
        Main: worker completed work //【譯注:注意這個結果到最后才輸出,下一節首句意
        思即是如此】
        */

        異步通知:委托
         不幸的是,peter又倒退了—就象他一開始想避免boss站在一旁邊監視他一樣。也
        就是說,他現在要監看整個工作過程。【譯注:請參見上節示例輸出結果的注釋】因此
        ,peter決定使用自己的委托作為異步委托完成時的通知方式,這樣他就可以立即回去工
        作,而當工作被打分時,仍然可以接到通知:
        public void DoWork()
        {
        //...
        Console.WriteLine("Worker: work completed");
        if( completed != null )
        {
        foreach( WorkCompleted wc in completed.GetInvocationList() )
        {
        wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);
        }
        }
        }
        private void WorkGraded(IAsyncResult res)
        {
        WorkCompleted wc = (WorkCompleted)res.AsyncState;
        int grade = wc.EndInvoke(res);
        Console.WriteLine("Worker grade= " + grade);
        }
        【譯注:下面給出本節例子完整代碼:
        using System;
        delegate void WorkStarted();
        delegate void WorkProgressing();
        delegate int WorkCompleted();
        class Worker
        {
         public void DoWork()
         {
        Console.WriteLine("Worker: work started");
        if( started != null ) started();
        Console.WriteLine("Worker: work progressing");
        if( progressing != null ) progressing();
        Console.WriteLine("Worker: work completed");
        if( completed != null )
        {
        foreach( WorkCompleted wc in completed.GetInvocationList() )
        {
        wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);
        }
        }
         }
        private void WorkGraded(IAsyncResult res)
        {
        WorkCompleted wc = (WorkCompleted)res.AsyncState;
        int grade = wc.EndInvoke(res);
        Console.WriteLine("Worker grade= " + grade);
        }
         public event WorkStarted started ;
         public event WorkProgressing progressing;
         public event WorkCompleted completed;
        }
        class Boss
        {
         public int WorkCompleted()
         {
        System.Threading.Thread.Sleep(3000);
        Console.WriteLine("Better...");
         return 6; /* out of 10 */
         }
        }
        class Universe
        {
         static void WorkerStartedWork()
         {
        Console.WriteLine("Universe notices worker starting work");
         }
         static int WorkerCompletedWork()
         {
        System.Threading.Thread.Sleep(4000);
        Console.WriteLine("Universe is pleased with worker's work");
         return 7;
         }
         static void Main()
         {
         Worker peter = new Worker();
         Boss boss = new Boss();
        peter.completed += new WorkCompleted(boss.WorkCompleted);
        peter.started += new WorkStarted(Universe.WorkerStartedWork);
        peter.completed += new WorkCompleted(Universe.WorkerCompletedWork)
        ;
        peter.DoWork();
        Console.WriteLine("Main: worker completed work");
        Console.ReadLine();
         }
        }
        /*以下是上段程序輸出結果:
        Worker: work started
        Universe notices worker starting work
        Worker: work progressing
        Worker: work completed
        Main: worker completed work //【譯注:異步委托發生了效果,因此這一行先輸出啦
        J】
        Better...
        Worker grade = 6
        Universe pleased with worker's work
        Worker grade = 7
        */

        同樂樂
         peter、boss和universe最終都滿意了。boss和universe都可以僅被通知其感興趣
        的事件,并減少了實現上的負擔和不必要的來回調用。peter可以通知他們每一個人,而
        不必管需要多長時間才能從那些目標方法中返回,并仍然可以異步得到評分結果。pete
        r知道做到這一點并不太容易,因為由于是異步觸發事件,目標方法就有可能運行在另一
        個線程里,就如上節示例一樣。不過,peter[J]和mike[J]是好朋友,而mike精通線程問
        題并可提供該領域的指導。
         從此,他們都很快樂J

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 国产亚洲AV手机在线观看| 丁香花免费高清视频完整版| 中文字幕版免费电影网站| 99xxoo视频在线永久免费观看| 成熟女人牲交片免费观看视频| 不卡一卡二卡三亚洲| 亚洲国产精品综合久久20| 色播在线永久免费视频网站| 男女交性永久免费视频播放| 亚洲人成在线影院| 无码人妻一区二区三区免费视频| 无码乱肉视频免费大全合集 | 亚洲色在线无码国产精品不卡| 叮咚影视在线观看免费完整版| 日韩视频免费在线| 亚洲理论在线观看| 免费网站看av片| 亚洲一区爱区精品无码| 特级av毛片免费观看| 日韩免费视频播播| 久草免费福利在线| 亚洲人成无码www久久久| 亚洲第一se情网站| 在线免费视频一区| 亚洲一区二区观看播放| 免费v片视频在线观看视频| 亚洲精品无码久久久久牙蜜区| 91久久精品国产免费直播| 亚洲国产一区在线| 最近免费中文字幕大全| 国产成人无码精品久久久免费| 免费国产在线观看老王影院| 精精国产www视频在线观看免费| 久久精品国产亚洲av成人| 成全视频高清免费观看电视剧| 亚洲尹人香蕉网在线视颅| 99re视频精品全部免费| 亚洲JLZZJLZZ少妇| 日韩一区二区在线免费观看| 成在线人免费无码高潮喷水| 亚洲av无码一区二区三区天堂古代|