<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
        主站蜘蛛池模板: 亚洲黄片手机免费观看| 日韩高清在线免费看| 亚洲精品tv久久久久久久久 | 毛片免费vip会员在线看| 亚洲国产精品张柏芝在线观看 | 免费高清小黄站在线观看| 国产精品亚洲精品青青青| 最近最新中文字幕完整版免费高清| 亚洲乱码在线播放| 毛片免费在线播放| 美女视频黄频a免费大全视频| 亚洲Av无码乱码在线播放| 在线播放国产不卡免费视频| 亚洲中文字幕无码一区二区三区| a色毛片免费视频| 久久精品国产亚洲AV大全| 黄色片在线免费观看 | 亚洲午夜福利在线视频| 日本高清免费中文字幕不卡| 特级毛片爽www免费版| 亚洲乱码中文字幕综合 | 99re在线视频免费观看| 亚洲国产精品综合久久久| 精品国产免费一区二区| 一级做a爰片性色毛片免费网站 | 国产精品亚洲午夜一区二区三区| 男女啪啪永久免费观看网站| 一个人看的www免费在线视频| 久久亚洲国产成人亚| 青青久在线视频免费观看| a级毛片免费观看在线| 亚洲天堂中文字幕| 国产精品99久久免费| 国产成人免费ā片在线观看老同学 | 亚洲av永久无码精品表情包| 国产成人yy免费视频| 免费国产va视频永久在线观看| 亚洲AV综合色一区二区三区| 亚州免费一级毛片| 免费中文字幕视频| 亚洲免费在线视频播放|