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

詳解WPF線程模型和Dispatcher

開發 后端
這里將介紹WPF線程模型和Dispatcher,首先我們要了解WPF應用程序從兩個線程開始:一個用于處理呈現,一個用于管理UI。希望能對大家有所幫助。
WPF線程模型是從WPF的兩個線程:一個用于處理呈現和一個用于管理UI開始。并展開同時討論Dispatcher的相關對象。

開始著手寫這個WPF系列,這里的一站式,就是力爭在每一個點上能把它講透,當然,做不到那么盡善盡美,如果有不對的地方也歡迎朋友們指正,我會逐步補充,爭取把這個系列寫好。

通常,WPF應用程序從兩個線程開始:一個用于處理呈現,一個用于管理UI。呈現線程有效地隱藏在后臺運行,而 UI 線程則接收輸入、處理事件、繪制屏幕以及運行應用程序代碼。

UI 線程對一個名為Dispatcher的對象內的工作項進行排隊。Dispatcher基于優先級選擇工作項,并運行每一個工作項,直到完成。每個 UI 線程都必須至少有一個Dispatcher,并且每個Dispatcher都只能在一個線程中執行工作項。

  這兩段是MSDN上關于WPF線程模型的描述。主要介紹了兩個概念:一,WPF中線程一分為二,一個用于呈現(Render),一個用于管理UI;二,在UI線程中,使用了一個名為Dispatcher的類幫助UI線程處理任務。

  那么這個線程模型和Dispatcher到底是怎樣的呢,它又有什么特點,有什么優缺點呢?在正式分析線程模型和Dispatcher之前,我先找一個插入點,希望這個插入點能為朋友們所理解。

  作為一個Presentation的基架,WPF的使命就是要編寫圖形化的操作界面。而在Windows操作系統上,圖形化界面是建立在消息機制這個基礎上的,那么創建一個窗口,要經歷哪些步驟呢?

  1. 創建窗口類。 WNDCLASSEX wcex; RegisterClassEx(&wcex);

  2. 創建窗口。CreateWindow(…); ShowWindow(…); UpdateWindow(…);

  3. 建立消息泵。  

  1. while (GetMessage(&msg, NULL, 0, 0))   
  2.   {   
  3.     TranslateMessage(&msg);   
  4.     DispatchMessage(&msg);   
  5.   }  

  打個比方,我們在一個自動化的廠房里生產設備?;谡?,我們會首先定義好該設備的模板,這就是創建窗口類,這里”類”更多表示類別的意思。模板定義完畢,我們可以正式生產設備了,這就是創建窗口,這個CreateWindow的時候會通過字符串來匹配到我們定義的模板(窗口類)。創建成功后,我們要讓設備動起來,就要像人一樣,體內一定要有類似于血液的流傳機制,把命令傳達到設備的各個部分,這就是消息泵,這個泵就像我們的心臟一樣,源源不斷的通過GetMessage并Dispatch來分發血液(消息)。既然我們通過消息來對設備下達指令,那么就要有消息隊列來存儲消息,在Windows中,線程為基本的調度單位,這個消息隊列就在線程上,當循環使用GetMessage時,就是在當前線程的消息隊列中任勞任怨的取出消息,然后分發到對應的窗口中去。

  那么具體到WPF,它又是一個怎么樣的情況,如何和老的技術兼容,又有什么新的突破呢?

  WPF引入了Dispatcher的概念,這個Dispatcher的主要功能類似于Win32中的消息隊列,在它的內部函數,仍然調用了傳統的創建窗口類,創建窗口,建立消息泵等操作。Dispatcher本身是一個單例模式,構造函數私有,暴露了一個靜態的CurrentDispatcher方法用于獲得當前線程的Dispatcher。對于線程來說,它對Dispatcher是一無所知的,Dispatcher內部維護了一個靜態的List _dispatchers, 每當使用CurrentDispatcher方法時,它會在這個_dispatchers中遍歷,如果沒有找到,則創建一個新的Dispatcher對象,加入到_dispatchers中去。Dispatcher內部維護了一個Thread的屬性,創建Dispatcher時會把當前線程賦值給這個Thread的屬性,下次遍歷查找的時候就使用這個字段來匹配是否在_dispatchers中已經保存了當前線程的Dispatcher。

  那么這個創建窗口,建立消息泵又是什么時候被調用的呢?在Dispatcher內部,維護了一個HwndWrapper的字段,在Dispatcher的構造函數中,調用了HwndWrapper的構造函數,這個創建窗口類,創建窗口就是在這個函數中被調用的。這里實際的類是MessageOnlyHwndWrapper,這個Message-Only,是Windows編程中常用的伎倆,創建一個隱藏窗口,僅僅用來派發消息。那么循環讀取消息的消息泵又是什么時候建立起來的呢?

  Dispatcher對外提供了一個靜態的Run函數,顧名思義,就是啟動Dispatcher,在函數內部,調用了PushFrame函數,在這個函數中,可以找到熟悉的GetMessage, TranslateAndDispatchMessage。那么這個PushFrame是怎么回事,Frame這個概念又是如何而來的呢?

  這個就是WPF線程模型引入的一個新的概念,嵌套消息泵,就是在一個While(GetMessage(...))內部又啟動了一個While(GetMessage(...))。每調用一次PushFrame,就會啟動一個新的嵌套的消息泵。每調用一次GetMessage,就在線程的消息隊列中取出一個消息,直至取出WM_QUIT的時候GetMessage才返回False。這個GetMessage函數Windows內部進行了處理,當消息隊列為空時,掛起執行線程,避免死循環的發生。關于嵌套消息泵的優缺點,我們稍后再講,先來看看Dispatcher是如何處理任務的:

  Windows中定義了很多Message,以WM_開頭,在注冊窗口類的時候需要設置窗口過程函數,GetMessage取得的消息再分發到窗口過程函數中,整個過程為: 

  

設置窗口過程函數

  這個圖來自于侯捷的經典書籍《深入淺出MFC》,1.首先創建Window并指定窗口的過程函數WndProc。2.當窗口創建時一個WM_CREATE被放入到消息隊列中,3.消息泵通過GetMessage取得該消息后分發到窗口,窗口過程函數處理這個WM_CREATE消息…

  那么WPF線程模型的Dispatcher在這個過程中扮演了什么角色呢?前面的1,2,3仍然如此,當窗口過程函數接收到消息時,它需要根據消息的類別把Windows消息轉譯成內部的RoutedEvent或者調用布局函數等來處理。前面提到了Dispatcher主要功能類似于Win32中的消息隊列,這個隊列中存放的對象是DispatcherOperation,這個DispatcherOperation,顧名思義,就是把每一個執行項封裝成一個對象,類似:

  

把每一個執行項封裝成一個對象

  這個隊列的類型為PriorityQueue,是一個含有優先級的隊列。WPF定義了這個優先級DispatcherPriority,有

  

優先級DispatcherPriority

  當對這個PriorityQueue調用DeQueue時,就會取出優先級***的任務。那么這個隊列中的任務是什么時候被添加的,又是什么時候被取出執行的呢?

  Dispatcher暴露了兩個方法,Invoke和BeginInvoke,這兩個方法還有多個不同參數的重載。其中Invoke內部還是調用了BeginInvoke,一個典型的BeginInvoke參數如下:

    public DispatcherOperation BeginInvoke(Delegate method, DispatcherPriority priority, params object[] args);

  在這個BeginInvoke內部,會把執行函數method與參數args封裝成DispatcherOperation,并按priority加入到PriorityQueue中,這個返回值就是內部創建的DispatcherOperation。也就是說每調用一次Invoke和BeginInvoke,就向Dispatcher中加入了一個任務,那么這個任務什么時候被執行呢?

  DispatcherPriority定義了很多優先級,WPF將這些優先級主要分成兩類。前臺優先級和后臺優先級,其中前臺包括Loaded~Send,后臺包括Background~Input。剩下的幾個優先級除了Invalid和Inactive都屬于空閑優先級,處理順序同后臺優先級。這個前臺優先級和后臺優先級的分界線是以Input來區分的,這里的Input指的是鍵盤輸入和鼠標移動、點擊等等。ProrityQueue的來源有:

  ProrityQueue的來源

  當然,這里Hwnd級別Hook到的消息最終也是調用Dispatcher的Invoke/BeginInvoke方法加入到Dispatcher的隊列中去的。當處理這個PriorityQueue時,會首先取得隊列中的***優先級,如果它屬于前臺優先級,執行。如果屬于后臺優先級,那么它要去掃描線程的消息隊列,看看其中是由有類似WM_MOUSEMOVE之類的Input消息。如果沒有,執行。如果存在,則放棄執行,并啟動一個Timer,當Timer喚起時繼續判斷是否可以執行。

  那么處理PriorityQueue的時機呢?當你調用BeginInvoke,向隊列中加入執行項的同時,也會調用處理Queue的判斷。判斷邏輯和上面類似,隊列中***優先級是前臺優先級,向隱藏窗口PostMessage,這個消息是Disptcher使用RegisterWinodwMessage注冊的自定義消息。然后在GetMessage的時候如果取出這個自定義消息,則處理PriorityQueue。如果是后臺優先級,掃描線程消息隊列的Input消息,決定是否啟動Timer還是PostMessage。

  舉個例子,在后臺線程中向UI線程中使用Invoke來發送請求,經歷的過程為:

  1. 調用Invoke,對傳入的參數DispatcherPriority進行判斷,如果是Send,這是個特殊的優先級,直接切換線程上下文,執行任務并返回。如果是其他的優先級,調用BeginInvoke。

  2. 在BeginInvoke中,把傳入的Delegate和參數封裝成DispatcherOperation,加入到PriorityQueue中。

  3. 調用隊列處理的請求函數,希望處理PriorityQueue。

  4. 如果隊列中***優先級屬于前臺優先級,調用PostMessage向隱藏窗口發送自定義消息。后臺處理這里省略不表。

  5. 在GetMessage中取得消息并分發到隱藏窗口,這里使用的是常見的SubWindow(注釋一),消息通過Hook發送到Dispatcher的WndProcHook函數進行處理。

  6. 在WndProcHook中,如果接收到的Window消息是Dispatcher自定義的消息,則真正處理PriorityQueue。

  7. 處理PriorityQueue,從中取出一個任務,進行前后臺優先級判斷,決定是否處理還是啟動Timer稍后處理。

  回過頭來,說一說嵌套的消息循環,這個要從模態對話框說起,一個通常的模態對話框場景如下:

    SomeCodeA();

    bool? result = dlg.ShowDialog();

    SomeCodeB();

  代碼運行在UI線程中,當執行到dlg.ShowDialog時,啟動模態對話框,等待用戶點擊Yes/No或者關閉對話框,對話框關閉后程序繼續執行SomeCodeB代碼。那么程序要在SomeCodeB處等待ShowDialog返回后才繼續執行。當然你可以使用WaitHandle來同步,不過這個需要掛起當前(UI)線程,如果主窗口中有動畫等UI動作,那么會停止得不到響應。這里WPF使用的是PushFrame,就是在ShowDialog內部又建立起了一個消息泵。While(GetMessage(…))。一方面,可以確保UI線程中的消息可以被處理;另一方面,因為是While循環,在對話框關閉時返回,可以確保SomeCodeB的執行順序。

  那么是不是這個嵌套的消息循環真的如此***呢?當然不是,它打開了一扇門的同時,也打開了另一扇門。一個情景,當收到WM_SIZE消息的時候,Layout系統開始處理,如果在這個處理過程中,又啟動了PushFrame,那么嵌套的消息泵就會繼續從消息隊列中取出消息,如果下一個消息也是WM_SIZE,那么進行處理。假設這個消息處理結束后這個嵌套的消息泵返回了,那么***個WM_SIZE得以繼續處理。這樣就發生了錯誤,本來12的處理順序變成了121。當然這種情況不僅僅發生在Layout中,所以WPF在Dispatcher中加入了一個DisableProcessing函數,在Layout等關鍵過程中調用了這個函數,在這個過程中停止pump消息和禁止PushFrame。

  在WPF中,所有的WPF對象都派生自DispatcherObject,DispatcherObject暴露了Dispatcher屬性用來取得創建對象線程對應的Dispatcher。鑒于線程親緣性,DispatcherObject對象只能被創建它的線程所訪問,其他線程修改DispatcherObject需要取得對應的Dispatcher,調用Invoke或者BeginInvoke來投入任務。一個UI線程至少有一個Dispatcher來建立消息泵處理任務,一個Dispatcher只能對應一個UI線程。那么UI線程和Render線程又如何呢?

  開篇提到,WPF線程模型一分為二,一個是UI線程,一個是Render線程。這兩個被設計成分離的關系,通過Channel(event)來進行通信。兩者之間的數量關系是一個WPF進程只能有一個Render線程,旦可以有大于等于一個的UI線程。通常情況下是一個UI線程,也就是一個Dispatcher,那么什么情況下需要建立多個呢?

  大多情況下是不需要的,少數情況下,比如MediaElement,或者Host其他ActiveX控件,我們期望在其他線程中創建,以提高性能。可以新建線程,在新線程中創建控件,并調用Dispatcher.Run啟動Dispatcher。這樣主Window和新控件就處在不同線程中,兩者間的通信可以使用VisualTarget連接視覺樹或者使用D3DImage拷貝新控件到主Window中顯示。

開篇有益,WPF沒有什么全新的技術,但提出了很多新的概念。


注釋一:  SubWindow,子窗口子類化。通常情況,所有同類別Window會共用同一個消息處理函數WndProc,子Window可以調用SetWindowLong用SubWndProc替換WndProc,這個通常稱為Sub-Window。

本文來自周永恒博客園文章《一站式WPF—線程模型和Dispatcher

【編輯推薦】

  1. Visual Studio 2010截圖曝光 以WPF開發UI
  2. 為WPF項目創建單元測試
  3. 詳解Silverlight和WPF互相擴展
  4. 教你如何理解WPF中的Template類
  5. 詳談WPF開發中的數據虛擬化
責任編輯:彭凡 來源: 博客園
相關推薦

2009-12-29 14:00:02

WPF Dispatc

2009-04-21 13:14:33

SilverlightWPF擴展

2024-03-15 09:44:17

WPFDispatcherUI線程

2009-12-23 17:42:37

WPF Control

2009-12-28 11:41:04

WPF 3.5特點

2009-12-28 10:47:58

WPF繪圖

2024-05-09 08:43:19

WPFUI線程UI更新

2010-01-28 16:45:44

Android單線程模

2024-09-09 17:00:25

XAML開發

2009-12-28 16:54:30

WPF注釋

2012-01-17 17:21:24

JavaSwing

2009-12-24 09:38:27

WPF用戶線程

2009-12-28 13:28:03

WPF視頻

2009-12-25 17:02:33

WPF多媒體

2009-12-24 15:36:41

WPF邏輯樹

2009-12-28 16:00:36

WPF樣式繼承

2009-12-25 17:48:43

WPF資源路徑

2009-12-28 16:28:35

WPF元素類型樣式

2009-12-24 17:57:53

WPF頁面跳轉

2010-09-09 14:52:56

CSS盒模型
點贊
收藏

51CTO技術棧公眾號

特级毛片在线| 亚洲精品国产手机| 水蜜桃精品av一区二区| 欧美福利一区二区| 久久人人爽人人爽人人av| 视频污在线观看| 日韩精品国产精品| 欧美成人在线免费| 中文字幕一区二区三区人妻| 亚洲淫成人影院| 中文字幕一区二区不卡 | 卡通动漫亚洲综合| 老司机成人在线| 欧美视频在线观看一区| 女人色极品影院| 国产午夜在线视频| 成人做爰69片免费看网站| 国产精品av网站| 国产亚洲精品成人| 91视频精品| 亚洲国产精品久久精品怡红院| 四季av一区二区| 成人福利影视| 国产精品久久久久桃色tv| 国产伦精品一区二区三区视频免费 | 日韩性xxxx爱| 好吊一区二区三区视频| 精品视频一区二区三区| 色婷婷av一区二区三区软件| 国产尤物av一区二区三区| 美丽的姑娘在线观看免费动漫| 国产精品一区二区三区四区| 国产va免费精品高清在线| 久久久久久久福利| 国产精品99一区二区三| 亚洲免费影视第一页| 性猛交╳xxx乱大交| 91高清视频免费| 欧美黄色免费在线观看| 欧美电影免费| 国产一区二区三区三区在线观看 | 91免费国产视频网站| 亚洲一区中文字幕在线观看| 少妇无套内谢久久久久| 国产一区二区高清| 久久久亚洲国产天美传媒修理工| 色哟哟一一国产精品| 日本一本不卡| 亚洲欧美日韩天堂| 亚洲av无码成人精品国产| 国产主播性色av福利精品一区| 7777精品久久久大香线蕉| 成人综合久久网| 六九午夜精品视频| 欧美熟乱第一页| 九九热在线免费| 免费电影日韩网站| 色噜噜狠狠成人网p站| 久久久免费视频网站| 欧亚av在线| 欧美色道久久88综合亚洲精品| 91九色丨porny丨国产jk| 啦啦啦中文在线观看日本| 一区二区三区高清不卡| 91视频 - 88av| 国产黄色大片在线观看| 亚洲午夜免费视频| 日本午夜激情视频| 超碰aⅴ人人做人人爽欧美| 黑人巨大精品欧美一区二区一视频 | 精品久久精品| 中文字幕精品—区二区| 日韩在线观看免| 亚洲欧美偷拍自拍| 久久免费成人精品视频| 国产一级片毛片| 日韩激情一区二区| 国产一区视频在线播放| 国内精品久久久久久久久久| 丰满少妇久久久久久久| 欧美激情导航| 在线免费av电影| 亚洲欧美日韩中文字幕一区二区三区| 中国老女人av| 菠萝蜜视频在线观看www入口| 亚洲不卡在线观看| 日本xxxxxxx免费视频| 国产乱子精品一区二区在线观看| 欧美人妇做爰xxxⅹ性高电影| 久久久久久国产精品日本| 99亚洲乱人伦aⅴ精品| 亚洲精品在线不卡| av最新在线观看| 99在线|亚洲一区二区| 国产福利精品在线| 国产普通话bbwbbwbbw| 99久久久免费精品国产一区二区| 欧美午夜精品久久久久久蜜| 毛片在线视频| 调教+趴+乳夹+国产+精品| 色多多视频在线播放| 91精品尤物| 一区二区三区天堂av| 国产第100页| 日本成人超碰在线观看| 国产99在线免费| av网站无病毒在线| 亚洲成av人片| 欧美日韩理论片| 免费黄色成人| 欧美丰满少妇xxxxx| 无码人妻久久一区二区三区 | www.我爱av| 久久久久久久久97黄色工厂| 国产在线拍揄自揄拍无码| 中文字幕在线视频网站| 91精品在线免费| 播金莲一级淫片aaaaaaa| 伊人青青综合网| 国产999在线观看| 人人妻人人澡人人爽久久av| 中文字幕在线一区二区三区| 欧美三级一级片| 久久伦理中文字幕| 中文字幕av一区中文字幕天堂| 精品人妻在线播放| 国产一区二区三区四| 四虎永久国产精品| 一个人看的www视频在线免费观看| 91精品国产综合久久蜜臀| 精品人妻互换一区二区三区| 亚洲高清免费| 3d蒂法精品啪啪一区二区免费| jizzjizz在线观看| 色婷婷综合视频在线观看| 欧美肉大捧一进一出免费视频 | 粉嫩蜜臀av国产精品网站| 综合国产精品久久久| 99久久久国产精品免费调教网站| 日韩av在线高清| 久久久久无码国产精品不卡| 国产毛片精品一区| 在线观看成人av| 国产激情久久| 少妇高潮久久77777| 超碰在线观看91| 久久久久综合网| 欧美女人性生活视频| 日韩大片在线免费观看| 午夜精品久久久久久久久久久久久| 精品人妻无码一区二区三区蜜桃一| 国产精品九色蝌蚪自拍| 色播五月综合网| 日韩综合精品| 国产日产久久高清欧美一区| 成人77777| 欧美少妇性性性| 亚洲欧美va天堂人熟伦| 老妇喷水一区二区三区| 日韩欧美一区二区视频在线播放 | 精品久久国产| 国产精品视频久久久| 91在线播放网站| 欧美日韩在线播放三区四区| 萌白酱视频在线| 极品尤物av久久免费看| 黄色网zhan| 亚洲专区**| 欧美性视频在线| 毛片免费在线观看| 欧美日本不卡视频| 精国产品一区二区三区a片| 不卡电影一区二区三区| 日本wwww视频| 第一会所亚洲原创| 亚洲999一在线观看www| 丁香花在线影院| 日韩精品999| 日韩欧美国产另类| 亚洲欧美电影一区二区| 白嫩情侣偷拍呻吟刺激| 久久激情中文| 亚洲一区二区三区精品视频| 欧美成人精品一级| 欧美在线性视频| 欧美性videos| 亚洲精品一区二区三区蜜桃下载 | av电影在线观看一区二区三区| 欧美日韩免费不卡视频一区二区三区| 潘金莲一级黄色片| gogogo免费视频观看亚洲一| 亚洲色成人一区二区三区小说| 成人激情免费视频| 99re6在线| 午夜欧美巨大性欧美巨大| 久久精品国产亚洲一区二区| 全国男人的天堂网| 欧美日韩精品一区二区天天拍小说| www欧美com| www日韩大片| 91在线第一页| 久久久水蜜桃av免费网站| 致1999电视剧免费观看策驰影院| 99精品国产高清一区二区麻豆| 国产精品第一视频| 国产精选在线| 久久精品国产亚洲一区二区| 欧洲亚洲在线| 日韩视频在线观看一区二区| 中文字幕在线欧美| 亚洲一线二线三线视频| 免费黄色片网站| 波多野结衣亚洲一区| 三级视频中文字幕| 国产欧美精品| 国产人妻互换一区二区| 少妇精品久久久一区二区三区| 91久久精品一区二区别| 91av一区| 欧美在线国产精品| 欧美6一10sex性hd| 久久精品电影网站| porn视频在线观看| 亚洲色图国产精品| 天天操天天射天天| 日韩美女一区二区三区| 亚洲天堂手机在线| 色八戒一区二区三区| 日本一区二区免费在线观看| 综合av第一页| 国产3级在线观看| 久久综合色婷婷| 中国极品少妇xxxx| 国产电影精品久久禁18| 五月天视频在线观看| 日本aⅴ免费视频一区二区三区| 成人中文字幕在线播放| 亚洲国内精品| 亚洲爆乳无码精品aaa片蜜桃| 国产精品福利在线观看播放| 日本精品二区| 国产成人一区二区三区影院| 欧美日韩视频在线一区二区观看视频| 国产伦理久久久久久妇女 | 97一区二区国产好的精华液| 成人免费网站在线| 国产欧美日韩电影| 91久久精品视频| 羞羞视频在线观看一区二区| 国产精品自产拍在线观看| 国产成人免费精品| 91精品久久久久久久久久入口| 国产精品伦一区二区| 国产精品久久不能| 欧美视频精品| 成人美女av在线直播| 亚洲精品aaa| 亚洲一区二区免费在线| 精品国产亚洲一区二区三区在线 | 精品一区二区三区四区五区 | 天天爱天天做天天爽| 91福利在线导航| 久草热在线观看| 欧美日韩国产一二三| 国产又黄又爽视频| 91精品国产一区二区| 亚洲AV无码精品国产| 亚洲精品97久久| 日av在线播放| 色av中文字幕一区| av在线播放国产| 国内免费久久久久久久久久久| 77thz桃花论族在线观看| 欧美在线视频导航| 欧美爱爱视频| 波多野结衣成人在线| 久久国产精品免费精品3p| 欧美日韩精品免费观看视一区二区| 国产一区二区精品福利地址| 亚洲一区二区三区加勒比| 欧美精品偷拍| 国产欧美在线一区| 久久97超碰色| 免费看黄色片的网站| 久久综合色一综合色88| 多男操一女视频| 亚洲国产视频直播| 精品人妻一区二区三区潮喷在线 | 中文字幕乱码人妻综合二区三区 | 欧美系列电影免费观看| 久久久久亚洲av无码专区喷水| 欧美午夜不卡| 免费日韩中文字幕| 国产剧情av麻豆香蕉精品| 国产极品一区二区| 最新欧美精品一区二区三区| 久草免费新视频| 欧美性xxxxxxxx| 成人毛片在线免费观看| 一本大道久久加勒比香蕉| 天天色天天射天天综合网| 日本高清+成人网在线观看| 亚洲一区二区av| 久久亚洲一区二区| 久久久久久久久久久久久久| 日本午夜激情视频| 国产一区二区三区综合| 中文字幕第20页| 亚洲国产视频一区二区| 一级片一区二区三区| 亚洲免费影视第一页| 啪啪免费视频一区| 国产在线日韩在线| 亚洲素人在线| 国产av熟女一区二区三区| 麻豆精品在线观看| 国产精品无码毛片| 一区二区三区欧美日韩| 伊人色综合久久久| 亚洲老头老太hd| www中文字幕在线观看| 成人黄色网免费| 欧美三级三级| 成年人视频网站免费观看| 成人高清视频免费观看| 欧美丰满熟妇bbbbbb| 欧美亚男人的天堂| 欧美老女人性开放| 午夜精品久久久久久久久久久久 | 北岛玲一区二区三区| 97超碰色婷婷| 国产精品高潮呻吟久久久久| 国产奶头好大揉着好爽视频| 日韩在线播放一区二区| 三叶草欧洲码在线| 欧美日韩国产专区| 日韩在线一区二区三区四区| 欧美国产日韩在线| 秋霞影院一区| 亚洲国产精品女人| 精品在线免费视频| 欧美88888| 欧美日韩高清一区| 免费看美女视频在线网站| 国产日韩欧美视频在线| 日韩免费视频| 性chinese极品按摩| 国产精品久久精品日日| 亚洲专区第一页| 最近中文字幕日韩精品 | 91国产成人在线| 欧美欧美欧美| 国产精品999999| 日韩在线观看电影完整版高清免费悬疑悬疑| 久久久亚洲精品无码| 成人av网站在线| 亚洲综合一二三| 亚洲男女性事视频| 日韩高清不卡| 亚洲一区二区四区| 国产一区在线看| 欧美日韩激情在线观看| 亚洲国产精品悠悠久久琪琪| 17videosex性欧美| 日本黑人久久| 国产综合一区二区| 妺妺窝人体色www聚色窝仙踪| 精品国产乱码久久久久久久 | 欧美三级三级| 亚洲精品成人在线播放| 亚洲精品国产无天堂网2021 | 豆国产96在线|亚洲| 久久精品欧美一区二区| 精品小视频在线| 电影一区电影二区| 欧美 日韩 国产精品| aa级大片欧美| 中文字幕一区二区免费| 欧美成人免费全部观看天天性色| 粉嫩的18在线观看极品精品| 超碰网在线观看| 中文字幕精品综合| 亚洲精品久久久久avwww潮水| 91精品国产色综合| 日韩国产一区二区| 女女调教被c哭捆绑喷水百合| 黄色91在线观看| 日本在线www| 国产精品果冻传媒潘| 免费在线观看视频一区| 国产在线综合网| 国产亚洲精品高潮| www.成人网| 手机在线成人免费视频| 亚洲狠狠爱一区二区三区| yw视频在线观看| 国产伦一区二区三区色一情| 三级成人在线视频| 国产精品第二十页| 久久久精品视频成人|