精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

異步編程:異步編程模型 (APM)

開發 后端
隨著技術的發展,又在“.NET1.0異步編程模型 (APM)”之后推出了“.NET2.0基于事件的編程模式”及“.NET4.X基于任務的編程模式”兩種異步編程模式。

異步編程模型 (APM)是.NET1.0的時候就已經推出的古老異步編程模式,此模式基于IAsyncResult接口實現。

隨著技術的發展,又在“.NET1.0異步編程模型 (APM)”之后推出了“.NET2.0基于事件的編程模式”及“.NET4.X基于任務的編程模式”兩種異步編程模式。盡管在新的設計上我們推薦都使用“.NET4.0基于任務的編程模式”,但我還是計劃整理出舊版的異步編程模型,因為:

1. 在一些特殊場合下我們可能覺得一種模式更適合;

2. 可以更充分認識三種模式之間的優劣,便于選擇;

3. 很多遺留的代碼包含了舊的設計模式;

4. 等等…

 

示例下載:異步編程:IAsyncResult異步編程模型.rar

 

IAsyncResult設計模式----規范概述

使用IAsyncResult設計模式的異步操作是通過名為 Begin*** 和 End*** 的兩個方法來實現的,這兩個方法分別指代開始和結束異步操作。例如,FileStream類提供BeginRead和EndRead方法來從文件異步讀取字節。這兩個方法實現了 Read 方法的異步版本。

在調用 Begin*** 后,應用程序可以繼續在調用線程上執行指令,同時異步操作在另一個線程上執行。(如果有返回值還應調用 End*** 來獲取操作的結果)。

1) Begin***

a) Begin*** 方法帶有該方法的同步版本簽名中聲明的任何參數。

b) Begin*** 方法簽名中不包含任何輸出參數。方法簽名最后兩個參數的規范是:第一個參數定義一個AsyncCallback委托,此委托引用在異步操作完成時調用的方法。第二個參數是一個用戶定義的對象。此對象可用來向異步操作完成時為AsyncCallback委托方法傳遞應用程序特定的狀態信息(eg:可通過此對象在委托中訪問End*** 方法)。另外,這兩個參數都可以傳遞null。

c) 返回IAsyncResult對象。

  1. // 表示異步操作的狀態。  
  2. [ComVisible(true)]  
  3. public interface IAsyncResult  
  4. {  
  5.     // 獲取用戶定義的對象,它限定或包含關于異步操作的信息。  
  6.     object AsyncState { get; }  
  7.     // 獲取用于等待異步操作完成的System.Threading.WaitHandle,待異步操作完成時獲得信號。  
  8.     WaitHandle AsyncWaitHandle { get; }  
  9.     // 獲取一個值,該值指示異步操作是否同步完成。  
  10.     bool CompletedSynchronously { get; }  
  11.     // 獲取一個值,該值指示異步操作是否已完成。  
  12.     bool IsCompleted { get; }  
  13. }  
  14.    
  15. // 常用委托聲明(我后面示例是使用了自定義的帶ref參數的委托)  
  16. public delegate void AsyncCallback(IAsyncResult ar) 

2) End***

a) End*** 方法可結束異步操作,如果調用 End*** 時,IAsyncResult對象表示的異步操作還未完成,則 End*** 將在異步操作完成之前阻塞調用線程。

b) End*** 方法的返回值與其同步副本的返回值類型相同。End*** 方法帶有該方法同步版本的簽名中聲明的所有out 和 ref 參數以及由BeginInvoke返回的IAsyncResult,規范上 IAsyncResult 參數放最后。

i. 要想獲得返回結果,必須調用的方法;

ii. 若帶有out 和 ref 參數,實現上委托也要帶有out 和 ref 參數,以便在回調中獲得對應引用傳參值做相應邏輯;

 

現在我們清楚了IAsyncResult設計模式的設計規范,接下來我們再通過IAsyncResult異步編程模式的三個經典場合來加深理解。

#p#

 

一、基于IAsyncResult構造一個異步API

現在來構建一個IAsyncResult的類,并且實現異步調用。

  1. // 帶ref參數的自定義委托  
  2. public delegate void RefAsyncCallback(ref string resultStr, IAsyncResult ar);  
  3.    
  4. public class CalculateAsyncResult : IAsyncResult  
  5. {  
  6.     private int _calcNum1;  
  7.     private int _calcNum2;  
  8.     private RefAsyncCallback _userCallback;  
  9.    
  10.     public CalculateAsyncResult(int num1, int num2, RefAsyncCallback userCallback, object asyncState)  
  11.     {  
  12.         this._calcNum1 = num1;  
  13.         this._calcNum2 = num2;  
  14.         this._userCallback = userCallback;  
  15.         this._asyncState = asyncState;  
  16.         // 異步執行操作  
  17.         ThreadPool.QueueUserWorkItem((obj) => { AsyncCalculate(obj); }, this);  
  18.     }  
  19.    
  20.     #region IAsyncResult接口  
  21.     private object _asyncState;  
  22.     public object AsyncState { get { return _asyncState; } }  
  23.    
  24.     private ManualResetEvent _asyncWaitHandle;  
  25.     public WaitHandle AsyncWaitHandle  
  26.     {  
  27.         get  
  28.         {  
  29.             if (this._asyncWaitHandle == null)  
  30.             {  
  31.                 ManualResetEvent event2 = new ManualResetEvent(false);  
  32.                 Interlocked.CompareExchange<ManualResetEvent>(ref this._asyncWaitHandle, event2, null);  
  33.             }  
  34.             return _asyncWaitHandle;  
  35.         }  
  36.     }  
  37.    
  38.     private bool _completedSynchronously;  
  39.     public bool CompletedSynchronously { get { return _completedSynchronously; } }  
  40.    
  41.     private bool _isCompleted;  
  42.     public bool IsCompleted { get { return _isCompleted; } }  
  43.     #endregion  
  44.    
  45.     /// <summary>  
  46.     ///  
  47.     /// 存儲最后結果值  
  48.     /// </summary>  
  49.     public int FinnalyResult { get; set; }  
  50.     /// <summary>  
  51.     /// End方法只應調用一次,超過一次報錯  
  52.     /// </summary>  
  53.     public int EndCallCount = 0;  
  54.     /// <summary>  
  55.     /// ref參數  
  56.     /// </summary>  
  57.     public string ResultStr;  
  58.    
  59.     /// <summary>  
  60.     /// 異步進行耗時計算  
  61.     /// </summary>  
  62.     /// <param name="obj">CalculateAsyncResult實例本身</param>  
  63.     private static void AsyncCalculate(object obj)  
  64.     {  
  65.         CalculateAsyncResult asyncResult = obj as CalculateAsyncResult;  
  66.         Thread.SpinWait(1000);  
  67.         asyncResult.FinnalyResult = asyncResult._calcNum1 * asyncResult._calcNum2;  
  68.         asyncResult.ResultStr = asyncResult.FinnalyResult.ToString();  
  69.    
  70.         // 是否同步完成  
  71.         asyncResult._completedSynchronously = false;  
  72.         asyncResult._isCompleted = true;  
  73.         ((ManualResetEvent)asyncResult.AsyncWaitHandle).Set();  
  74.         if (asyncResult._userCallback != null)  
  75.             asyncResult._userCallback(ref asyncResult.ResultStr, asyncResult);  
  76.     }  
  77. }  
  78.    
  79. public class CalculateLib  
  80. {  
  81.     public IAsyncResult BeginCalculate(int num1, int num2, RefAsyncCallback userCallback, object asyncState)  
  82.     {  
  83.         CalculateAsyncResult result = new CalculateAsyncResult(num1, num2, userCallback, asyncState);  
  84.         return result;  
  85.     }  
  86.    
  87.     public int EndCalculate(ref string resultStr, IAsyncResult ar)  
  88.     {  
  89.         CalculateAsyncResult result = ar as CalculateAsyncResult;  
  90.         if (Interlocked.CompareExchange(ref result.EndCallCount, 1, 0) == 1)  
  91.         {  
  92.             throw new Exception("End方法只能調用一次。");  
  93.         }  
  94.         result.AsyncWaitHandle.WaitOne();  
  95.    
  96.         resultStr = result.ResultStr;  
  97.    
  98.         return result.FinnalyResult;  
  99.     }  
  100.    
  101.     public int Calculate(int num1, int num2, ref string resultStr)  
  102.     {  
  103.         resultStr = (num1 * num2).ToString();  
  104.         return num1 * num2;  
  105.     }  

使用上面通過IAsyncResult設計模式實現的帶ref引用參數的異步操作,我將展示三種阻塞式響應異步調用和一種無阻塞式委托響應異步調用。即:

1. 執行異步調用后,若我們需要控制后續執行代碼在異步操作執行完之后執行,可通過下面三種方式阻止其他工作:

a) IAsyncResult的AsyncWaitHandle屬性,待異步操作完成時獲得信號。

b) 通過IAsyncResult的IsCompleted屬性進行輪詢。通過輪詢還可實現進度條功能。

c) 調用異步操作的 End*** 方法。

2. 執行異步調用后,若我們不需要阻止后續代碼的執行,那么我們可以把異步執行操作后的響應放到回調中進行。

  1. public class Calculate_Test  
  2. {  
  3.     public static void Test()  
  4.     {  
  5.         CalculateLib cal = new CalculateLib();  
  6.    
  7.         // 基于IAsyncResult構造一個異步API  
  8.         IAsyncResult calculateResult = cal.BeginCalculate(123, 456, AfterCallback, cal);  
  9.         // 執行異步調用后,若我們需要控制后續執行代碼在異步操作執行完之后執行,可通過下面三種方式阻止其他工作:  
  10.         // 1、IAsyncResult 的 AsyncWaitHandle 屬性,帶異步操作完成時獲得信號。  
  11.         // 2、通過 IAsyncResult 的 IsCompleted 屬性進行輪詢。通過輪詢還可實現進度條功能。  
  12.         // 3、調用異步操作的 End*** 方法。  
  13.         // ***********************************************************  
  14.         // 1、calculateResult.AsyncWaitHandle.WaitOne();  
  15.         // 2、while (calculateResult.IsCompleted) { Thread.Sleep(1000); }  
  16.         // 3、  
  17.         string resultStr = string.Empty;  
  18.         int result = cal.EndCalculate(ref resultStr, calculateResult);  
  19.     }  
  20.    
  21.     /// <summary>  
  22.     /// 異步操作完成后做出響應  
  23.     /// </summary>  
  24.     private static void AfterCallback(ref string resultStr, IAsyncResult ar)  
  25.     {  
  26.         // 執行異步調用后,若我們不需要阻止后續代碼的執行,那么我們可以把異步執行操作后的響應放到回調中進行。  
  27.         CalculateLib cal = ar.AsyncState as CalculateLib;  
  28.    
  29.         //int result = cal.EndInvoke(ref resultStr, calculateResult1);  
  30.         //if (result > 0) { }  
  31.     }  

#p#

二、使用委托進行異步編程

對于委托,編譯器會為我們生成同步調用方法“invoke”以及異步調用方法“BeginInvoke”和“EndInvoke”。對于異步調用方式,公共語言運行庫 (CLR) 將對請求進行排隊并立即返回到調用方,由線程池的線程調度目標方法并與提交請求的原始線程并行運行。

異步委托是快速為方法構建異步調用的方式,它基于IAsyncResult設計模式實現的異步調用,即,通過BeginInvoke返回IAsyncResult對象;通過EndInvoke獲取結果值。

示例:

上節的CalculateLib類中的同步方法以及所要實用到的委托如下:

  1. // 帶ref參數的自定義委托  
  2. public delegate int AsyncInvokeDel(int num1, int num2, ref string resultStr);  
  3. public int Calculate(int num1, int num2, ref string resultStr)  
  4. {  
  5.     resultStr = (num1 * num2).ToString();  
  6.     return num1 * num2;  

然后,通過委托進行同步或異步調用:

  1. AsyncInvokeDel calculateAction = cal.Calculate;  
  2. string resultStrAction = string.Empty;  
  3. // int result1 = calculateAction.Invoke(123, 456, ref resultStrAction);  
  4. IAsyncResult calculateResult1 = calculateAction.BeginInvoke(123, 456, ref resultStrAction, null, null);  
  5. int result1 = calculateAction.EndInvoke(ref resultStrAction, calculateResult1); 

#p#

三、多線程操作控件

訪問 Windows 窗體控件本質上不是線程安全的。如果有兩個或多個線程操作某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。還可能出現其他與線程相關的 bug,包括爭用情況和死鎖。確保以線程安全方式訪問控件非常重要。

不過,在有些情況下,您可能需要多線程調用控件的方法。.NET Framework 提供了從任何線程操作控件的方式:

1. 非安全方式訪問控件(此方式請永遠不要再使用)

多線程訪問窗口中的控件,可以在窗口的構造函數中將Form的CheckForIllegalCrossThreadCalls靜態屬性設置為false。

  1. // 獲取或設置一個值,該值指示是否捕獲對錯誤線程的調用,  
  2. // 這些調用在調試應用程序時訪問控件的System.Windows.Forms.Control.Handle屬性。  
  3. // 如果捕獲了對錯誤線程的調用,則為 true;否則為 false。  
  4. public static bool CheckForIllegalCrossThreadCalls { get; set; } 

2. 安全方式訪問控件

原理:從一個線程封送調用并跨線程邊界將其發送到另一個線程,并將調用插入到創建控件線程的消息隊列中,當控件創建線程處理這個消息時,就會在自己的上下文中執行傳入的方法。(此過程只有調用線程和創建控件線程,并沒有創建新線程)

注意:從一個線程封送調用并跨線程邊界將其發送到另一個線程會耗費大量的系統資源,所以應避免重復調用其他線程上的控件。

1) 使用BackgroundWork后臺輔助線程控件控件(AsyncOperationManager類和AsyncOperation類幫助器方式)。

2) 結合TaskScheduler.FromCurrentSynchronizationContext() 和Task 實現。

3) 使用Control類上提供的Invoke 和BeginInvoke方法。

 

因本文主要解說IAsyncResult異步編程模式,所以只詳細分析Invoke 和BeginInvoke跨線程訪問控件方式。

Control類實現了ISynchronizeInvoke接口,提供了Invoke和BeginInvoke方法來支持其它線程更新GUI界面控件的機制。

  1. public interface ISynchronizeInvoke  
  2. {  
  3.     // 獲取一個值,該值指示調用線程是否與控件的創建線程相同。  
  4.     bool InvokeRequired { get; }  
  5.     // 在控件創建的線程上異步執行指定委托。  
  6.     AsyncResult BeginInvoke(Delegate method, params object[] args);  
  7.     object EndInvoke(IAsyncResult asyncResult);  
  8.     // 在控件創建的線程上同步執行指定委托。  
  9.     object Invoke(Delegate method, params object[] args);  

1) Control類的 Invoke,BeginInvoke 內部實現如下:

a) Invoke (同步調用)先判斷控件創建線程與當前線程是否相同,相同則直接調用委托方法;否則使用Win32API的PostMessage 異步執行。

b) BeginInvoke (異步調用)使用Win32API的PostMessage 異步執行.

  1. UnsafeNativeMethods.PostMessage(new HandleRef(thisthis.Handle)  
  2.                   , threadCallbackMessage, IntPtr.Zero, IntPtr.Zero);  
  3. [DllImport("user32.dll", CharSet=CharSet.Auto)]  
  4. public static extern bool PostMessage(HandleRefhwnd, intmsg, IntPtrwparam, IntPtrlparam); 

PostMessage 是windows api,用來把一個消息發送到一個窗口的消息隊列。這個方法是異步的,也就是該方法封送完畢后馬上返回,不會等待委托方法的執行結束,調用者線程將不會被阻塞。(對應同步方法的windows api是:SendMessage())

2) InvokeRequired

獲取一個值,該值指示調用線程是否與控件的創建線程相同。內部關鍵如下:

  1. Int windowThreadProcessId = SafeNativeMethods.GetWindowThreadProcessId(ref2, out num);  
  2. Int currentThreadId = SafeNativeMethods.GetCurrentThreadId();  
  3. return (windowThreadProcessId != currentThreadId); 

即返回“通過GetWindowThreadProcessId功能函數得到創建指定窗口線程的標識和創建窗口的進程的標識符與當前線程Id進行比較”的結果。

3) 示例(詳見示例文件)

在使用的時候,我們使用 this.InvokeRequired 屬性來判斷是使用Invoke或BeginInvoke 還是直接調用方法。

  1. private void InvokeControl(object mainThreadId)  
  2. {  
  3.     if (this.InvokeRequired)  
  4.     {  
  5.         this.Invoke(new Action<String>(ChangeText), "InvokeRequired = true.改變控件Text值");  
  6.         //this.textBox1.Invoke(new Action<int>(InvokeCount), (int)mainThreadId);  
  7.     }  
  8.     else 
  9.     {  
  10.         ChangeText("在創建控件的線程上,改變控件Text值");  
  11.     }  
  12. }  
  13.    
  14. private void ChangeText(String str)  
  15. {  
  16.     this.textBox1.Text += str;  

注意,在InvokeControl方法中使用 this.Invoke(Delegate del) 和使用 this.textBox1.Invoke(Delegate del) 效果是一樣的。因為在執行Invoke或BeginInvoke時,內部首先調用 FindMarshalingControl() 進行一個循環向上回溯,從當前控件開始回溯父控件,直到找到最頂級的父控件,用它作為封送對象。也就是說 this.textBox1.Invoke(Delegate del) 會追溯到和 this.Invoke(Delegate del) 一樣的起點。(子控件的創建線程一定是創建父控件的線程,所以這種追溯不會導致將調用封送到錯誤的目的線程)

 

 

 

本節到此結束,本節主要講了異步編程模式之一“異步編程模型(APM)”,是基于IAsyncResult設計模式實現的異步編程方式,并且構建了一個繼承自IAsyncResult接口的示例,及展示了這種模式在委托及跨線程訪問控件上的經典應用。下一節中,我將為大家介紹基于事件的編程模型……

原文鏈接:http://www.cnblogs.com/heyuquan/archive/2013/03/22/2976420.html

責任編輯:林師授 來源: 博客園
相關推薦

2014-07-15 10:08:42

異步編程In .NET

2025-07-01 06:05:34

2013-04-01 15:25:41

異步編程異步EMP

2020-10-15 13:29:57

javascript

2011-02-22 08:49:16

.NET同步異步

2011-02-22 09:09:21

.NETAsync CTP異步

2015-04-22 10:50:18

JavascriptJavascript異

2014-05-23 10:12:20

Javascript異步編程

2017-07-13 12:12:19

前端JavaScript異步編程

2016-09-07 20:43:36

Javascript異步編程

2023-06-13 13:39:00

多線程異步編程

2022-01-02 09:29:37

模型洋蔥Koa

2013-08-20 15:54:14

異步編程windows編程

2021-06-02 09:01:19

JavaScript 前端異步編程

2021-06-06 16:56:49

異步編程Completable

2011-11-11 15:47:22

JavaScript

2016-12-30 13:43:35

異步編程RxJava

2022-07-08 14:14:04

并發編程異步編程

2024-04-24 10:57:54

Golang編程

2021-03-22 08:45:30

異步編程Java
點贊
收藏

51CTO技術棧公眾號

韩国av网站在线| 少妇又紧又色又爽又刺激视频| 日本一区二区乱| 亚洲成在线观看| 欧美一级爽aaaaa大片| 中文字幕第31页| 久久久人成影片免费观看| 精品久久久久久久人人人人传媒| 天堂…中文在线最新版在线| 国产私人尤物无码不卡| 国产一区二区三区久久久| 91精品国产91久久久久久久久 | 日本道在线观看| 红桃成人av在线播放| 这里只有精品99re| 看av免费毛片手机播放| 黄网站免费在线观看| 99久久er热在这里只有精品66| 国产精品一区电影| 91视频免费网址| 综合久久精品| 中文字幕亚洲综合久久筱田步美| 大尺度在线观看| 色噜噜成人av在线| 色呦呦国产精品| 无码人妻少妇伦在线电影| 超碰免费97在线观看| 成人福利视频网站| 亚洲自拍在线观看| 精品乱码一区内射人妻无码| 亚洲欧美高清| 欧美精品www| 国产福利视频网站| 欧美中文一区二区| 日韩精品中文字幕视频在线| 亚洲精品鲁一鲁一区二区三区 | 亚洲最大成人综合网| 538任你躁精品视频网免费| 欧美三级电影一区| 日韩网址在线观看| 性国裸体高清亚洲| 亚洲成人高清在线| 国产精品久久久久久久久电影网| 国产秀色在线www免费观看| 国产日韩欧美在线一区| 久久久久久九九| 人妻丰满熟妇av无码区hd| 国产久卡久卡久卡久卡视频精品| 国产精品永久免费观看| 在线视频精品免费| 蜜桃视频一区二区三区| 国产精品白嫩美女在线观看| 波多野结衣黄色| 三级不卡在线观看| 国产精品久久久久久久久久东京| 国产污视频网站| 三级成人在线视频| 国产精品黄色av| 丰满熟女人妻一区二区三| 奇米影视在线99精品| 国产精品爱啪在线线免费观看| 岛国av中文字幕| 久久资源在线| 国产精品高潮呻吟久久av无限| jizz国产在线观看| 日韩电影在线观看一区| 国产精品第一视频| 在线观看国产一区二区三区| 久久成人麻豆午夜电影| 91色在线视频| 亚洲第一视频在线| 99久久精品情趣| 欧美一区二区三区成人久久片| 国产在线超碰| 亚洲欧洲精品一区二区精品久久久| 中文字幕一区二区三区有限公司| 国产调教视频在线观看| 亚洲无人区一区| 成人免费在线小视频| japanese23hdxxxx日韩| 欧美日韩成人综合| 成人做爰69片免费| 亚洲人成网77777色在线播放| 一本一本久久a久久精品牛牛影视| 免费黄在线观看| 雨宫琴音一区二区三区| 91精品国产免费久久久久久| 懂色av蜜臀av粉嫩av喷吹| 久久99在线观看| 国产一区二区免费在线观看| 成人在线观看免费| 一区二区高清免费观看影视大全 | 亚洲高潮女人毛茸茸| 91精品国产麻豆国产在线观看| 久久久久久伊人| 日韩精品一区不卡| 国产精品99久久久久久久vr| 久久爱av电影| 黄色网址在线免费播放| 亚洲成av人片在线| 91亚洲免费视频| 精品在线网站观看| 日韩中文字幕久久| 91香蕉在线视频| 韩日精品视频一区| 欧美午夜欧美| 国产丝袜在线播放| 欧美在线不卡视频| 青青草视频网站| 99热在线成人| 日韩av毛片网| 男人天堂av网| 亚洲欧美日韩一区| 天天操天天爱天天爽| 9l视频自拍九色9l视频成人| 亚洲欧美一区二区三区久久| 五月天丁香激情| 美女mm1313爽爽久久久蜜臀| 精品国产乱码一区二区三区四区| 日本中文字幕在线2020| 日韩欧美第一页| 日韩av福利在线观看| 精品国产美女| 日本老师69xxx| 殴美一级特黄aaaaaa| 亚洲欧美二区三区| 国产一级片自拍| 精品国产一区二区三区香蕉沈先生| 午夜精品一区二区三区在线| 国产免费一区二区三区最新不卡 | 免费在线看黄网址| 精品一区二区三区欧美| 日韩wuma| 日韩精品三区| 亚洲欧美国产精品专区久久| 国产精品99无码一区二区| 狠狠网亚洲精品| 亚洲国产精品毛片| 成人精品电影在线| 国产丝袜精品视频| av资源免费观看| 99久久精品免费| 僵尸世界大战2 在线播放| 亚洲免费一区三区| 欧美日韩成人黄色| 亚洲av永久无码国产精品久久| 中文字幕中文字幕在线一区 | 亚洲欧美中文另类| 粉嫩aⅴ一区二区三区| 成人看片黄a免费看在线| 日韩精品一区二区在线视频| 136导航精品福利| 久久久久久香蕉网| 视频一区二区三区在线看免费看| 欧美日韩国产丝袜美女| chinese麻豆新拍video| 国产精品色网| 蜜桃成人免费视频| 欧美男体视频| 色婷婷**av毛片一区| 在线视频欧美亚洲| 自拍偷拍欧美激情| 色姑娘综合天天| 亚洲午夜伦理| 久精品国产欧美| 户外露出一区二区三区| 色偷偷亚洲男人天堂| 国产精品无码AV| 一区二区三区欧美亚洲| 欧美日韩人妻精品一区在线| 亚洲影音一区| 亚洲精品国产一区| 欧美第一在线视频| 97精品一区二区视频在线观看| 毛片在线能看| 欧美日韩一本到| 美国黄色小视频| av网站一区二区三区| 亚洲国产精品久久久久爰色欲| 亚洲动漫精品| 成人免费激情视频| 91桃色在线| 亚洲人成电影在线播放| 国产精品探花视频| 五月天中文字幕一区二区| 波多野吉衣中文字幕| 久久成人免费日本黄色| 欧美日韩不卡在线视频| 国产区精品区| 99久久免费国| 美女网站视频一区| 欧美高清性猛交| 免费在线看v| 日韩一级完整毛片| 欧美精品韩国精品| 亚洲欧美经典视频| 熟女少妇一区二区三区| 久久精品国产精品亚洲红杏| 日本xxxxxxxxxx75| 国产精品福利在线观看播放| 国产午夜精品在线| 99久久这里有精品| 高清欧美性猛交xxxx| 不卡在线视频| 亚洲电影av在线| 国产欧美日韩成人| 91福利在线导航| 中文字幕一区二区三区手机版 | 亚洲精品美女久久7777777| 8x国产一区二区三区精品推荐| 日本高清不卡在线| 久久久久黄久久免费漫画| 北条麻妃一区二区三区中文字幕| 亚洲人成色777777精品音频| 欧美一区二区三区播放老司机| 欧美brazzers| 天天色天天爱天天射综合| 亚洲天堂黄色片| 欧美激情自拍偷拍| 人妻丰满熟妇aⅴ无码| 国产成人自拍在线| 91看片破解版| 免费在线欧美视频| 97成人在线观看视频| 亚洲香蕉网站| 黄色一级片av| 午夜激情久久| 亚洲午夜精品久久久中文影院av| 九一亚洲精品| 国模无码大尺度一区二区三区| 你懂的视频在线一区二区| 6080成人| 99热最新在线| 日韩有吗在线观看| 91在线精品播放| 一区二区三区日本视频| 国产精品视频99| 国产精品亚洲一区二区三区在线观看 | 欧美无人区码suv| 国产91精品露脸国语对白| 91丝袜超薄交口足| 久久99久久久久| 91丨九色丨蝌蚪| 国产在线视频一区二区三区| 香蕉视频999| 国产一区二区视频在线播放| 青青草久久伊人| 精东粉嫩av免费一区二区三区| 色戒在线免费观看| 久久精品国产在热久久| 国产一级片自拍| 国产一区二区精品久久99| 91网址在线观看精品| 国产一区二区三区免费看| 无人码人妻一区二区三区免费| 黄网站免费久久| 亚洲精品久久久久久| 丁香婷婷深情五月亚洲| 亚洲婷婷在线观看| 91在线国产福利| 国产免费无遮挡吸奶头视频| 中文字幕精品一区二区精品绿巨人 | 香蕉成人app| 国产精品区二区三区日本| 精品少妇一区| 日本在线免费观看一区| 日韩在线高清| 欧美做暖暖视频| 亚洲少妇一区| 国产一二三区av| 国产精品996| 蜜桃精品成人影片| 国产精品天干天干在线综合| 在线免费观看亚洲视频| 亚洲成人av一区| 精品国产乱子伦| 91精品国模一区二区三区| 99久久国产免费| 亚洲精品mp4| 69xxxx欧美| 欧美人与性动交| 欧美7777| 91在线精品观看| 一区二区三区韩国免费中文网站| 视频三区二区一区| 欧美日韩国产综合网| 1024精品视频| 国产尤物一区二区| 少妇户外露出[11p]| 国产精品视频麻豆| 国产亚洲精品久久久久久打不开 | 中文字幕乱码在线观看| 日韩欧美一区中文| 每日更新在线观看av| 久久久精品一区二区三区| 老司机深夜福利在线观看| 国产精品99久久久久久久久久久久 | 亚洲伊人成综合成人网| 精品欧美午夜寂寞影院| 亚洲欧洲精品一区二区| 亚洲日本久久| 中文字幕12页| 久久免费偷拍视频| 久草视频免费在线| 欧美日韩一区三区四区| 色欲av伊人久久大香线蕉影院| 中文字幕亚洲欧美在线| 国产免费拔擦拔擦8x在线播放| 国产免费一区二区三区在线观看 | 久久精品xxxxx| 国产欧美日韩一区二区三区| 日本一二区不卡| 国产在线青青草| 成人免费视频caoporn| 国产精品久久久久久成人| 狠狠色噜噜狠狠狠狠97| www三级免费| 久久精品国产综合| 欧亚一区二区| 久久亚裔精品欧美| 亚洲成人直播| 国产成人精品一区二区在线小狼| 亚洲国产成人午夜在线一区| 日韩特级黄色片| 亚洲第一精品自拍| 午夜成年人在线免费视频| 国产美女精品视频| 欧美理论在线播放| 91猫先生在线| jizz一区二区| 久久黄色免费视频| 欧美一区二区精品| 麻豆网站在线观看| 国产精品免费看久久久香蕉| 亚洲欧美校园春色| av观看免费在线| 久久久久久久综合狠狠综合| 五月婷婷开心网| 日韩久久精品成人| 成人性生活视频| 欧美日韩电影一区二区三区| 香蕉亚洲视频| 日本激情小视频| 色婷婷综合久久久中文字幕| 日韩二区三区| 日本中文字幕久久看| 久久99性xxx老妇胖精品| av天堂永久资源网| 久久九九影视网| 亚洲视频在线免费播放| 日韩在线中文字幕| 久久99成人| 黄色一级片av| av成人老司机| 欧美一级淫片免费视频黄| 亚洲天堂网在线观看| 日韩高清在线| 亚洲最新在线| 国产风韵犹存在线视精品| 久久精品99久久久久久| 亚洲黄页网在线观看| 日本不卡1234视频| 天堂资源在线亚洲视频| 久热成人在线视频| 在线免费日韩av| 亚洲护士老师的毛茸茸最新章节| 亚洲少妇视频| 亚洲蜜桃av| 国产成人在线观看免费网站| 日本熟妇色xxxxx日本免费看| 日韩不卡中文字幕| www.成人在线视频| 狠狠噜天天噜日日噜| 91网页版在线| 在线视频免费观看一区| 久久久久久91| 精品国产一区二区三区香蕉沈先生 | 精品国产91乱码一区二区三区 | 午夜久久一区| 国产一级二级在线观看| 在线观看免费亚洲| 超碰电影在线播放| 九九热久久66| 韩国一区二区视频| 免费在线观看黄网站| 中文字幕免费国产精品| 免费一级欧美片在线观看网站| 日日碰狠狠添天天爽超碰97| 中文字幕免费在线观看视频一区| 性一交一乱一乱一视频| 国产精品扒开腿做爽爽爽的视频| 伊人情人综合网| 欧美性猛交xxxx乱| 欧美精品一区二区三区高清aⅴ | 欧美裸体网站| 国产在线播放一区三区四| 亚欧视频在线观看| 久久久国产一区二区三区| 免费av一区| 亚洲成a人无码|