<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        .NET異步編程總結----四種實現模式代碼總結

        來源:懂視網 責編:小采 時間:2020-11-27 22:36:20
        文檔

        .NET異步編程總結----四種實現模式代碼總結

        .NET異步編程總結----四種實現模式代碼總結:最近很忙,既要外出找工作又要兼顧老板公司的項目。今天在公司,忙里偷閑,總結一下.NET中的異步調用函數的實現方法,DebugLZQ在寫這篇博文之前自己先動手寫了本文的所有示例代碼,開寫之前是做過功課的,用代碼說話方有說服力。 本文的內容旨在用最簡潔的代
        推薦度:
        導讀.NET異步編程總結----四種實現模式代碼總結:最近很忙,既要外出找工作又要兼顧老板公司的項目。今天在公司,忙里偷閑,總結一下.NET中的異步調用函數的實現方法,DebugLZQ在寫這篇博文之前自己先動手寫了本文的所有示例代碼,開寫之前是做過功課的,用代碼說話方有說服力。 本文的內容旨在用最簡潔的代

        最近很忙,既要外出找工作又要兼顧老板公司的項目。今天在公司,忙里偷閑,總結一下.NET中的異步調用函數的實現方法,DebugLZQ在寫這篇博文之前自己先動手寫了本文的所有示例代碼,開寫之前是做過功課的,用代碼說話方有說服力。

        本文的內容旨在用最簡潔的代碼來把異步調用的方法說清楚,園子里的高手老鳥可以繞行,不喜勿噴,非誠勿擾~

        lz的前一篇文章簡單的說了下異步,主要是從理解上來講;這篇文章主要寫具體的實現方法。實現異步編程有4種方法可供選擇,這4種訪求實際上也對應著4種異步調用的模式,分為“等待”和“回調”兩大類。四種方法,我在代碼中都進行了詳細的注釋,這里不羅嗦了,直接用代碼說明吧

        第一種方法:BeginEnvoke EndEnvoke方法,屬于“等待”類。

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading;
        
        namespace 異步調用實現方法匯總
        {
         /// <summary>
         /// 異步調用方法總結:
         /// 1.BeginEnvoke EndEnvoke
         /// 當使用BeginInvoke異步調用方法時,如果方法未執行完,EndInvoke方法就會一直阻塞,直到被調用的方法執行完畢
         /// </summary>
         class Program
         {
         public delegate void PrintDelegate(string s);
         static void Main(string[] args)
         {
         PrintDelegate printDelegate = Print;
         Console.WriteLine("主線程");
        
         IAsyncResult result= printDelegate.BeginInvoke("Hello World.", null, null);
         Console.WriteLine("主線程繼續執行...");
         //當使用BeginInvoke異步調用方法時,如果方法未執行完,EndInvoke方法就會一直阻塞,直到被調用的方法執行完畢
         printDelegate.EndInvoke(result);
        
         Console.WriteLine("Press any key to continue...");
         Console.ReadKey(true);
         }
        
         public static void Print(string s)
         {
         Console.WriteLine("異步線程開始執行:"+s);
         Thread.Sleep(5000);
         }
         }
        }
        
        

        需要注意的地方,代碼中都有注明了,程序運行結果如下:

        第二種方法:WaitOne。同樣屬于“等待”類。

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading;
        
        namespace 異步調用實現方法匯總2
        {
         /// <summary>
         /// 異步調用方法總結:
         /// 2.WaitOne
         /// 可以看到,與EndInvoke類似,只是用WaitOne函數代碼了EndInvoke而已。
         /// </summary>
         class Program
         {
         public delegate void PrintDelegate(string s);
         static void Main(string[] args)
         {
         PrintDelegate printDelegate = Print;
         Console.WriteLine("主線程");
         IAsyncResult result = printDelegate.BeginInvoke("Hello World.", null, null);
         Console.WriteLine("主線程繼續執行...");
         result.AsyncWaitHandle.WaitOne(-1, false);
        
         Console.WriteLine("Press any key to continue...");
         Console.ReadKey(true);
         }
         public static void Print(string s)
         {
         Console.WriteLine("異步線程開始執行:" + s);
         Thread.Sleep(5000);
         }
         }
        }
        
        

        需要注意的地方,代碼中都有注明了,程序運行結果如下:

        第三種方法:輪詢。也是屬于“等待”類。

         using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading;
        
        namespace 異步調用實現方法匯總3
        {
         /// <summary>
         /// 異步調用方法總結:
         /// 3.輪詢
         /// 之前提到的兩種方法,只能等下異步方法執行完畢,
         /// 在完畢之前沒有任何提示信息,整個程序就像沒有響應一樣,用戶體驗不好,
         /// 可以通過檢查IasyncResult類型的IsCompleted屬性來檢查異步調用是否完成,
         /// 如果沒有完成,則可以適時地顯示一些提示信息
         /// </summary>
         class Program
         {
         public delegate void PrintDelegate(string s);
         static void Main(string[] args)
         {
         PrintDelegate printDelegate = Print;
         Console.WriteLine("主線程:"+Thread.CurrentThread.ManagedThreadId );
         IAsyncResult result = printDelegate.BeginInvoke("Hello world.", null, null);
         Console.WriteLine("主線程:" + Thread.CurrentThread.ManagedThreadId + ",繼續執行...");
         while (!result.IsCompleted)
         {
         Console.WriteLine(".");
         Thread.Sleep(500);
         }
        
         Console.WriteLine("主線程:" + Thread.CurrentThread.ManagedThreadId + " Press any key to continue...");
         Console.ReadKey(true);
         }
         public static void Print(string s)
         {
         Console.WriteLine("當前線程:" + Thread.CurrentThread.ManagedThreadId + s);
         Thread.Sleep(5000);
         }
         }
        }
        
        

        需要注意的地方,代碼中都有注明了,程序運行結果如下:

        第四種方法:回調。當然屬于“回調”類。推薦!!!!

        之前三種方法者在等待異步方法執行完畢后才能拿到執行的結果,期間主線程均處于等待狀態。回調和它們最大的區別是,在調用BeginInvoke時只要提供了回調方法,那么主線程就不必要再等待異步線程工作完畢,異步線程在工作結束后會主動調用我們提供的回調方法,并在回調方法中做相應的處理。

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading;
        
        namespace 異步調用實現方法匯總4
        {
         /// <summary>
         /// 異步調用方法總結:
         /// 4.回調
         /// 之前三種方法者在等待異步方法執行完畢后才能拿到執行的結果,期間主線程均處于等待狀態。
         /// 回調和它們最大的區別是,在調用BeginInvoke時只要提供了回調方法,那么主線程就不必要再等待異步線程工作完畢,
         /// 異步線程在工作結束后會主動調用我們提供的回調方法,并在回調方法中做相應的處理,例如顯示異步調用的結果。
         /// </summary>
         class Program
         {
         public delegate void PrintDelegate(string s);
         static void Main(string[] args)
         {
         PrintDelegate printDelegate = Print;
         Console.WriteLine("主線程.");
         printDelegate.BeginInvoke("Hello world.", PrintComeplete, printDelegate);
         Console.WriteLine("主線程繼續執行...");
        
         Console.WriteLine("Press any key to continue...");
         Console.ReadKey(true);
         }
         public static void Print(string s)
         { 
         Console.WriteLine("當前線程:"+s);
         Thread.Sleep(5000);
         }
         //回調方法要求
         //1.返回類型為void
         //2.只有一個參數IAsyncResult
         public static void PrintComeplete(IAsyncResult result)
         {
         (result.AsyncState as PrintDelegate).EndInvoke(result);
         Console.WriteLine("當前線程結束." + result.AsyncState.ToString());
         }
         }
        }
        
        

        需要注意的地方,代碼中都有注明了,程序運行結果如下:

        通過EndInvoke方法得到同步函數的返回值。上面的同步方法返回值為void,我們給個例子:

        using System.Diagnostics;
        using System.Threading;
        using System.Windows;
        
        namespace TestDelegateWrapper
        {
         /// <summary>
         /// Interaction logic for MainWindow.xaml
         /// </summary>
         public partial class MainWindow : Window
         {
         public MainWindow()
         {
         InitializeComponent();
         }
        
         private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
         {
         WrapperSyncMethodAsync("ABC");
        
         Trace.WriteLine("Main thread continue...");
         }
        
         private delegate string SyncMethod1Delegate(string str);
         
         private void WrapperSyncMethodAsync(string str)
         {
         SyncMethod1Delegate syncMethod1Delegate = SyncMethod1;
         syncMethod1Delegate.BeginInvoke(str, x =>
         {
         var result= syncMethod1Delegate.EndInvoke(x);
        
         // using the result to do something
         Trace.WriteLine(result);
         }, null);
         }
        
         private string SyncMethod1(string str)
         {
         Thread.Sleep(2000);
         return str;
         }
         }
        }
        
        
        

        輸出如下:

        Main thread continue...
        ABC

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .NET異步編程總結----四種實現模式代碼總結

        .NET異步編程總結----四種實現模式代碼總結:最近很忙,既要外出找工作又要兼顧老板公司的項目。今天在公司,忙里偷閑,總結一下.NET中的異步調用函數的實現方法,DebugLZQ在寫這篇博文之前自己先動手寫了本文的所有示例代碼,開寫之前是做過功課的,用代碼說話方有說服力。 本文的內容旨在用最簡潔的代
        推薦度:
        標簽: 模式 實現 代碼
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 毛片a级毛片免费播放下载| 亚洲欧美国产精品专区久久| 猫咪免费观看人成网站在线| 女人张腿给男人桶视频免费版| 亚洲另类精品xxxx人妖| AV无码免费永久在线观看| 亚洲一区在线免费观看| 99久久久精品免费观看国产| 亚洲国产成人精品无码一区二区 | 羞羞网站免费观看| 国产精品麻豆免费版| 国产精品日本亚洲777| 国产禁女女网站免费看| 偷自拍亚洲视频在线观看| 亚洲国产高清精品线久久| 九九全国免费视频| 亚洲AV无码国产精品麻豆天美 | 免费A级毛片无码无遮挡内射| 亚洲乱码一二三四区国产| 免费高清在线影片一区| 老外毛片免费视频播放| 亚洲一区精品无码| 最近免费中文字幕大全高清大全1| 亚洲国产美女在线观看 | 在线A亚洲老鸭窝天堂| 日韩视频免费在线观看| 亚洲成人高清在线观看| 国产黄色片在线免费观看| 精品久久久久久无码免费| 亚洲五月六月丁香激情| 24小时免费直播在线观看| 白白色免费在线视频| 亚洲A∨无码一区二区三区| 国产1024精品视频专区免费| 高h视频在线免费观看| 国产V亚洲V天堂无码| 精品香蕉在线观看免费| 国产精品亚洲а∨无码播放麻豆 | 亚洲国产精品无码久久久久久曰| 中文字幕日本人妻久久久免费| 亚洲精品动漫在线|