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

探秘WF4 Beta2中工作流對象模型

開發(fā) 后端
今天我們要討論的是WF4 Beta2中的工作流對象模型,希望本文能對大家了解WF4 Beta2的一些特性有所幫助。

本文將討論WF4 Beta2中的工作流對象模型,在.NET 4.0中工作流是變化比較大的一部分,希望那個通過本文能讓大家對WF4 Beta2有一個全新的認識。

隨著Visual Studio2010 BETA2的發(fā)布,大家對.NET 4.0技術(shù)的研究熱情隨之高漲。在整個.NET 4.0所引入的新技術(shù)中,工作流可謂是變化最大的部分。WF4與WF3幾乎可以看成是兩個完全不同的產(chǎn)品。

對于WF3的編程模型,已有相關(guān)的技術(shù)書籍介紹了,在網(wǎng)上也可以搜到有關(guān)的資源。但對于WF4,卻幾乎找不到任何深入介紹其對象模型的文章。

我以Reflector作為工具,反匯編了WF4的源代碼,通過仔細閱讀,粗步理出了一個頭緒,在本文中進行介紹,期望能起到一個拋磚引玉的作用,幫助大家深入地把握WF4的技術(shù)內(nèi)幕。

呵呵,第一次在博客園發(fā)文,希望大家多多鼓勵。

1 Acitvity的繼承樹

在WF4中,Activity類是最頂層的基類。任何一個工作流都由至少一個Activtiy構(gòu)成。以下是WF4中Activity的繼承樹:

WF4中Activity的繼承樹

 

在真實的工作流中,各個Activity可以相互嵌套,形成一個樹型結(jié)構(gòu),最底層的葉子通常就是上圖中最底層類(如CodeActivity)的實例。

最頂層的Activity類提供了一個可以供子類重寫的InternalExecute()方法:

  1. internal virtual void InternalExecute(ActivityInstance instance,   
  2. ActivityExecutor executor, BookmarkManager bookmarkManager); 

子類可以重寫此方法,在此方法中實現(xiàn)各種功能,這個方法在WF4內(nèi)部非常重要,許多東西都與它相關(guān)。

為了方便地供開發(fā)者自定義業(yè)務(wù)處理邏輯,諸如CodeActivity之類最底層的類,另定義了一個抽象的Execute()方法:

  1. protected abstract void Execute(CodeActivityContext context); 

當(dāng)開發(fā)者自定義Activity時,就可以直接地重寫此方法。

簡言之,工作流的運行就體現(xiàn)為Activity對象樹中葉子節(jié)點Execute方法(或類似的方法,比如DynamicActivity是InternalExecute方法,AsyncCodeActivity是BeginExecute和EndExecute方法)的執(zhí)行。

2.WF4中工作流的執(zhí)行原理

首先要明確,在WF4中,如果使用WorkflowInvoker類來啟動工作流時:

  1. WorkflowInvoker.Invoke(new Workflow1()); 

工作流Workflow1將在調(diào)用者的線程中執(zhí)行。這種情況下,工作流的執(zhí)行類似于方法調(diào)用,是最簡單的執(zhí)行模式。

然而,如果使用WorkflowApplication啟動工作流,工作流實例將在調(diào)用者線程之外的另一個線程中運行:

  1. WorkflowApplication wpp = new WorkflowApplication(new Workflow1());  
  2. wpp.Run(); 

而且,這個“另外的工作線程”是線程池中的線程。

不管是由哪個線程負責(zé)執(zhí)行工作流,有一個原則是很重要的:

單個工作流實例是單線程執(zhí)行的,哪怕諸如Parallel Activity給你一個多分支“并行”運行的假象。

事實上,Parallel Activity采用在單線程中“輪換執(zhí)行”各分支。當(dāng)一個分支進入空閑“Idle”時,工作流調(diào)度器調(diào)度下一分支投入運行。所果所有分支都不包括使本分支進入Idle狀態(tài)的Activtity(比如有一個Delay Activity或創(chuàng)建了書簽),則Parallel Activity按從左到右的順序執(zhí)行各分支。

那么,構(gòu)成工作流的各個Activity實例是如何執(zhí)行的?

WF運行時在內(nèi)部為每個工作流維護了一個工作項隊列。然后,創(chuàng)建一個Scheduler類的實例來負責(zé)從此工作項隊列中取出和追加工作項,并執(zhí)行之。

這里要說說這個工作項隊列,在Scheduler類的代碼中可以找到它的聲明:

  1. private Quack<WorkItem> workItemQueue; 

這里有一個奇怪的Quack<T>泛型類,我仔細看了一下,其實它就是一個泛型隊列,但它有一點特殊之處:

Quack<T>泛型類在內(nèi)部使用一個數(shù)組來保存數(shù)據(jù):

  1. private T[] items; 

初始時,為隊列分配可容納4個T類型對象的內(nèi)存空間,當(dāng)不斷增加對象而需要擴充空間時,就分配一個“當(dāng)前所占內(nèi)存空間*2”的新數(shù)組,再將老數(shù)組中的內(nèi)容復(fù)制到新數(shù)組中。

很明顯,在兩個數(shù)組中復(fù)制元素會花費系統(tǒng)資源,我不知道為何WF4的設(shè)計者這樣設(shè)計,估計是他們有其他的考慮。

隊列中的WorkItem對象很有趣,它代表一個將被執(zhí)行的Activity實例,這里暫時放下,一會兒還會介紹它。

Scheduler對象的工作可以簡述如下:

它從隊列中取出一個WorkItem對象,然后將其委托給線程池中的線程(如果工作流由WorkApplication以異步方式啟動執(zhí)行)或調(diào)用者線程(如果工作流由WorkflowInvoker以同步方式啟動執(zhí)行)執(zhí)行。這些線程將負責(zé)調(diào)用WorkItem所封裝的Activity實例的Execute()方法(或類似的方法,如前所述)。

3 深入分析Activity執(zhí)行的流程
 一個Activity實例到底是如何執(zhí)行的?一切得從WorkItem類開始。

WorkItem是一個抽象基類,提供了幾個抽象方法,其中最重要的就是Execute()方法:

  1. internal abstract class WorkItem  
  2. {  
  3. //……  
  4. private ActivityInstance activityInstance;  
  5. public abstract bool Execute(ActivityExecutor executor,   
  6. BookmarkManager bookmarkManager);  

上述聲明中還有兩個很重要的類ActivityInstance和ActivityExecutor。

ActivityInstance代表著正在運行的一個Activity實例,它包容一堆的internal方法可以完成Activity的執(zhí)行(Execute)取消(Cancel)和放棄(Abort)的功能。 ActivityExecutor則負責(zé)調(diào)用ActivityInstance中的這些方法。

WorkItem有一堆的子類,這些子類又派生出“孫”類。比如,其中的一個分支如下:

分支如下

 

不管有幾個子孫,后代一般都重寫了WorkItem所定義的Execute()抽象方法。

我們以ExecuteRootWorkItem類為例,顧名思義,這應(yīng)該是與工作流中最頂層的Activity相對應(yīng)的WorkItem。它的Execute()方法如下所示:

  1. public override bool Execute(ActivityExecutor executor, BookmarkManager bookmarkManager)  
  2. {  
  3. return base.ExecuteBody(executor, bookmarkManager, this.resultLocation);  

它將調(diào)用基類ExecuteActivityWorkItem的ExecuteBody()方法,此方法的關(guān)鍵代碼如下:

  1. protected bool ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)  
  2. {  
  3. //……  
  4. base.ActivityInstance.Execute(executor, bookmarkManager);  
  5. //……  
  6. }  

可以看到,它直接跳去執(zhí)行最頂層基類WorkItem所定義的ActivityInstance對象的Execute()方法。此方法的代碼如下:

  1. internal void Execute(ActivityExecutor executor, BookmarkManager bookmarkManager)  
  2. {  
  3. //……  
  4. this.Activity.InternalExecute(this, executor, bookmarkManager);  

注意ActivityInstance實際上封裝了一個Activity對象:

  1. public sealed class ActivityInstance : ActivityInstanceMap.IActivityReference  
  2. {  
  3. public Activity Activity { getinternal set; }  
  4. //……  

所以,ActivityInstance對象的Execute()方法實際上執(zhí)行的是Activity對象的InternalExecute()方法。再追蹤下去:

  1. internal virtual void InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)  
  2. {  
  3. //……  
  4. executor.ScheduleActivity(this.runtimeImplementation, instance, nullnullnull);  

注意:上述代碼是Acitivity對InternalExecute()默認的實現(xiàn)方式,它的子類(比如CodeActivity)通常會重寫它。

可以看到,在ActivityInstance對象的Execute()方法中,執(zhí)行流程轉(zhuǎn)給了從前面一路傳送過來的ActivityExecutor對象,由此對象的ScheduleActivity方法負責(zé)將Activity插入到工作項隊列中。

ActivityExecutor.ScheduleActivity方法又進行了一個“倒手”,調(diào)用自己的ScheduleBody()方法:

  1. private ActivityInstance ScheduleActivity(……)  
  2. {  
  3. //……  
  4. this.ScheduleBody(scheduledInstance, requiresSymbolResolution, argumentValueOverrides, resultLocation);  
  5. }  

在ScheduleBody()方法中,“佛祖”終于現(xiàn)出真身,我們看到了Scheduler的身影:

  1. internal void ScheduleBody(ActivityInstance activityInstance, bool requiresSymbolResolution, IDictionary<stringobject> argumentValueOverrides, Location resultLocation)  
  2. {  
  3. if (resultLocation == null)  
  4. {  
  5. //……  
  6. this.scheduler.PushWork(new ExecuteExpressionWorkItem(activityInstance, requiresSymbolResolution, argumentValueOverrides, resultLocation));  
  7. //……  

在上述代碼中,Scheduler對象將activityInstance轉(zhuǎn)換為了一個ExecuteExpressionWorkItem,然后將其插入到工作項隊列中等待執(zhí)行。

現(xiàn)在我們看到,默認情況下,對ExecuteRootWorkItem的執(zhí)行將導(dǎo)致一個新的ExecuteExpressionWorkItem工作項被插入到工作項隊列中。

4.工作項隊列中的工作項是如何調(diào)度執(zhí)行的?

Scheduler類負責(zé)工作項的調(diào)度執(zhí)行。

在Scheduler類的構(gòu)造函數(shù)中,掛接了一個回調(diào)函數(shù)OnScheduledWork:

  1. static Scheduler()  
  2. {  
  3. //……  
  4. onScheduledWorkCallback = Fx.ThunkCallback(new SendOrPostCallback(Scheduler.OnScheduledWork));  

在OnScheduledWork()函數(shù)中,揭露出了任務(wù)項調(diào)度是如何進行的秘密:

  1. private static void OnScheduledWork(object state)  
  2. {  
  3. //取出隊列中的第一個工作項  
  4. WorkItem firstWorkItem = scheduler.firstWorkItem;  
  5. if ((scheduler.workItemQueue != null) && (scheduler.workItemQueue.Count > 0))  
  6. {  
  7. scheduler.firstWorkItem = scheduler.workItemQueue.Dequeue();  
  8. }  
  9. else 
  10. {  
  11. scheduler.firstWorkItem = null;  
  12. }  
  13. //執(zhí)行這一工作項  
  14. continueAction = scheduler.callbacks.ExecuteWorkItem(firstWorkItem);  
  15. //……  

下面是ExecuteWorkItem()方法的代碼,可以看到,最后調(diào)度器還是委托activityExecutor來執(zhí)行Activity的:

  1. public Scheduler.RequestedAction ExecuteWorkItem(WorkItem workItem)  
  2. {  
  3. Scheduler.RequestedAction objA = this.activityExecutor.OnExecuteWorkItem(workItem);  
  4. //……  
  5. }  
  6. ActivityExecutor的OnExecuteWorkItem()方法有很多代碼,其中關(guān)鍵的就是以下這幾句:  
  7. internal Scheduler.RequestedAction OnExecuteWorkItem(WorkItem workItem)  
  8. {  
  9. //……  
  10. propertyManagerOwner.PropertyManager.SetupWorkflowThread();  
  11. if ((abortException == null) && !workItem.Execute(thisthis.bookmarkManager))  
  12. {  
  13. return Scheduler.YieldSilently;  
  14. }  
  15. }  
  16. //……  

我們終于發(fā)現(xiàn)了調(diào)用工作項的Execute()方法的語句。

有的朋友可能會疑惑,我們的探索之旅從WorkItem.Execute()方法開始,轉(zhuǎn)了一圈怎么又回到了WorkItem.Execute()方法?這樣一來,調(diào)用工作項的WorkItem.Execute()方法將導(dǎo)致一個工作項被加入到隊列中,然后當(dāng)此工作項被執(zhí)行時,它又將一個工作項加入到隊列中,這會不會引發(fā)無限遞歸?

事實上這正是我們想要的效果。因為一個工作流實例實際上就是一個層層嵌套的遞歸的結(jié)構(gòu),這種設(shè)計使得執(zhí)行其頂層Activity對象的Execute()方法時,會將其子Activity所對應(yīng)的WorkItem加入到隊列中加以遞歸執(zhí)行。

很明顯,對于那些不包容子Activity的Activity,我們應(yīng)該“打斷”這種遞歸執(zhí)行的過程。WF4是怎么做到的?

以一個實例來說明更好。 請看以下自定義的Activity:

  1. public sealed class Prompt : CodeActivity  
  2. {  
  3. public InArgument<string> Text { getset; }  
  4. protected override void Execute(CodeActivityContext context)  
  5. {  
  6. Console.Write(Text.Get(context));  
  7. }  

注意上述Activity重寫了基類CodeActivity的Execute()方法,此方法一執(zhí)行完畢就會返回。

前面說過,對工作項隊列中WorkItem.Execute()方法的調(diào)用,最終將轉(zhuǎn)換為對ActivityInstance對象的Execute()方法的調(diào)用。而ActivityInstance又包容了最終的Activity對象實例,并將調(diào)用轉(zhuǎn)給這一最終對象的InternalExecute()方法,為方便起見,重貼此方法代碼如下:

  1. internal void Execute(ActivityExecutor executor, BookmarkManager bookmarkManager)  
  2. {  
  3. //……  
  4. this.Activity.InternalExecute(this, executor, bookmarkManager);  
  5. }  

在我們的自定義Activity中,沒有重寫CodeActivity的InternalExecute()方法(事實上也不可能,因為此方法是Sealed的),所以,被調(diào)用的實際上是基類CodeActivity的InternalExecute()方法。以下是CodeActivity的InternalExecute()方法代碼:

  1. internal sealed override void InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)  
  2. {  
  3. //……  
  4. this.Execute(context);  
  5. //……  

非常清楚,它應(yīng)用了多態(tài)特性,調(diào)用子類重寫的Execute()方法,注意,它并沒有調(diào)用最頂層Activity類所提供的InternalExecute()方法。

所以,問題的關(guān)鍵在于最頂層基類Activity的InternalExecute()方法,默認情況下,此方法將會通過 ActivityExecutor.ScheduleActivity()方法的調(diào)用將一個工作項加入到隊列中,但CodeActivity沒調(diào)用Activity基類的InternalExecute()方法而是重寫了此方法,所以就打斷了“遞歸”調(diào)用鏈。

5.小結(jié)

不知道朋友們是不是有點昏了,沒辦法,WF4內(nèi)部就是有這么多的彎彎繞。   

簡單地說:工作流執(zhí)行時,所有需要被執(zhí)行的Activity會被封裝為一個WorkItem,被放到一個工作項隊列中,然后由WF4調(diào)度器(其實就是Scheduler類的實例)負責(zé)從此隊列中取出工作項執(zhí)行。

工作項的執(zhí)行可以由線程池中的線程承擔(dān)。,也可以由調(diào)用者線程來承擔(dān)。

WF4內(nèi)部的工作原理非常復(fù)雜,事實上我們也沒有必要了解其每個技術(shù)細節(jié)。但如果能了解其大致的內(nèi)部原理還是非常有用的,它能幫助我們避開陷阱,真正地把技術(shù)用好。

對于技術(shù),不僅要知其然,還要知其所以然。才能真正擁有了自由。

原文標(biāo)題:探索WF4 Beta2的工作流對象模型

鏈接:http://www.cnblogs.com/bitfan/archive/2009/10/29/1592591.html

【編輯推薦】

  1. 淺談WF 4.0 Beta1中的 跟蹤機制
  2. WF4.0 Beta1中的規(guī)則引擎變化
  3. 淺談WF 4.0 beta1的跟蹤配置
  4. 詳解工作流架構(gòu)與實現(xiàn)
  5. 詳解WF4.0 Beta2中的Switch<T>活動
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-10-22 08:54:56

WF4 Beta 2

2009-12-01 10:08:23

WF4屬性

2009-10-28 09:23:27

WF4.0 Beta2

2010-01-14 09:35:10

WF4.0

2009-06-15 10:20:47

WF 4.0 Beta跟蹤機制

2013-10-10 15:08:36

UbuntuUbuntu 13.1gnome

2009-06-22 09:36:06

WF 4.0 beta跟蹤配置

2012-06-12 13:23:58

LinuxLinux Deepi

2021-08-13 10:09:36

鴻蒙HarmonyOS應(yīng)用

2009-11-25 11:31:36

Visual Stud

2022-10-26 08:00:43

Activiti工作流BPM

2013-06-25 10:13:11

iOS7WWDC蘋果

2021-10-14 11:34:05

技術(shù)工作流引擎

2009-11-18 09:14:49

Visual Stud

2013-04-23 10:28:08

IBeamMDAAWF

2024-04-25 08:00:00

DevOps架構(gòu)軟件開發(fā)

2011-09-27 10:40:48

Ubuntu 11.1

2009-12-14 09:40:50

VS 2008 Bet

2016-11-09 16:43:40

蘋果iOS 10.2

2011-12-13 20:47:33

iOS 5.1
點贊
收藏

51CTO技術(shù)棧公眾號

2001个疯子在线观看| 国产又粗又大又爽| 99热播精品免费| 国产精品电影院| 国产不卡在线观看| 久久午夜精品视频| gogo久久日韩裸体艺术| 欧美色欧美亚洲高清在线视频| 成人午夜电影免费在线观看| 黄色一级视频免费看| 亚洲国产日韩欧美在线| 亚洲精品日韩在线| 久久婷婷五月综合色国产香蕉| 黄片毛片在线看| 亚洲国产激情| 亚洲精品中文字幕有码专区| 亚洲在线观看网站| 日韩免费电影| 亚洲午夜久久久久中文字幕久| 不卡视频一区二区三区| 中文字幕日本视频| 999亚洲国产精| 久久成人精品视频| 天天躁夜夜躁狠狠是什么心态 | 不卡av日日日| 亚洲精品国产熟女久久久| 9l亚洲国产成人精品一区二三| 亚洲一线二线三线视频| 亚洲欧美日韩国产成人综合一二三区| 一区二区www| 性欧美精品高清| 久久久久亚洲精品国产| 久久国产高清视频| 成人影视亚洲图片在线| 亚洲精品天天看| 亚洲精品激情视频| 日韩毛片免费观看| 动漫精品一区二区| 免费一级特黄毛片| 国产福利电影在线| 国产亚洲午夜高清国产拍精品| 国产精品一区久久久| 特级做a爱片免费69| 亚洲高清av| 国内精品久久久久伊人av| 青草影院在线观看| 伊人色**天天综合婷婷| 日韩最新在线视频| 女人18毛片毛片毛片毛片区二| av毛片精品| 欧美成人在线直播| 日本一区二区三区在线免费观看| 国产在线精彩视频| 欧美日韩国产专区| 亚洲乱码中文字幕久久孕妇黑人| 麻豆网站在线| 亚洲欧洲精品一区二区精品久久久| 国产一区二区三区无遮挡| 囯产精品久久久久久| 丁香激情综合五月| 久久国产精品一区二区三区四区| 97人人爽人人爽人人爽| 国产精品一区专区| 99热在线播放| 四虎精品一区二区三区| 极品尤物av久久免费看| 亚洲精品欧美日韩专区| 亚洲不卡在线视频| 九九在线精品视频| 91中文字精品一区二区| 殴美一级特黄aaaaaa| 国产在线观看一区二区| 亚洲综合中文字幕在线| 国模人体一区二区| 久久精品视频在线免费观看| 午夜精品短视频| 米奇精品一区二区三区| 亚洲一区在线观看免费| 国产黄色一级网站| 日韩黄色碟片| 亚洲成色777777女色窝| 亚洲色成人网站www永久四虎| 粉嫩久久久久久久极品| 亚洲欧美日韩爽爽影院| 免费在线观看黄色小视频| 亚洲天堂偷拍| 国产成人av网| wwwav在线播放| 久久影音资源网| 在线无限看免费粉色视频| yellow字幕网在线| 欧美日韩精品二区第二页| 国产吃瓜黑料一区二区| 国产一区二区三区日韩精品| 美女性感视频久久久| 日韩在线观看视频一区二区| 欧美国产一区二区三区激情无套| 亚洲欧美色图片| caoporn91| 日韩精品电影在线| 北条麻妃高清一区| yourporn在线观看中文站| 一区二区欧美精品| 天堂一区在线观看| 亚洲伦理一区二区| 精品五月天久久| 成人免费毛片东京热| 久久福利影视| 国产精品久久亚洲| 欧美一区二区三区在线观看免费| 国产精品国产三级国产普通话99| 亚洲午夜精品一区二区三区| 第一福利在线视频| 日韩午夜在线观看| 美女网站视频色| 久久欧美肥婆一二区| dy888夜精品国产专区| 成人午夜电影在线观看| 欧美视频在线免费| 亚洲成年人在线观看| 93在线视频精品免费观看| 日韩美女视频中文字幕| 最近中文字幕免费观看| 久久99久久久久久久久久久| 蜜桃网站成人| 日本最新在线视频| 色一情一乱一乱一91av| 中文字幕无码人妻少妇免费| 欧美一区成人| 亚洲影视中文字幕| 精产国品自在线www| 欧美唯美清纯偷拍| 亚洲自拍偷拍图| 欧美精品国产一区二区| 91精品视频在线| 日p在线观看| 欧美日韩中文另类| 欧美成人另类视频| 丝袜脚交一区二区| 亚洲一区中文字幕在线观看| 水莓100国产免费av在线播放| 国产精品色婷婷| 黄色免费网址大全| 欧美日韩中文字幕一区二区三区 | 日本大片在线播放| 欧美一卡在线观看| 午夜写真片福利电影网| 国产精品一区在线| www.日本三级| 国产另类在线| 538国产精品一区二区免费视频| 一区二区三区免费观看视频| 中文字幕高清一区| 羞羞的视频在线| 国产精品精品| 亚洲自拍高清视频网站| 国产精品毛片一区二区三区四区| 亚洲免费av在线| 欧美老女人bb| 亚洲精品123区| 欧美二区在线看| 欧美日韩女优| 美女福利视频一区| 欧美一区二区三区激情| 成人免费在线视频观看| 91蝌蚪视频在线| 伊人成人在线视频| 91久久国产综合久久蜜月精品| www日韩tube| 91精品久久久久久久91蜜桃| 久草免费在线观看视频| 97超碰欧美中文字幕| 欧美黑人视频一区| 囯产精品久久久久久| 欧美日韩精品在线观看| 亚洲丝袜在线观看| 99热精品在线| 亚洲黄色成人久久久| 日韩精品亚洲专区在线观看| 国内精品久久久久久影视8| www.成人精品| 精品久久久久久久久久久久| 9.1在线观看免费| 日韩在线一二三区| 毛片在线视频观看| 国产乱码精品一区二区亚洲| 国产91ⅴ在线精品免费观看| а√天堂中文在线资源bt在线| 欧洲一区在线电影| 超碰手机在线观看| 久久综合九色综合97_久久久| 国产乱子伦农村叉叉叉| 成人在线免费观看网站| 国产精品二区在线观看| 成人自拍视频网| 久久久影视精品| 最新av网站在线观看| 亚洲成人av资源网| 一本色道久久综合精品婷婷| 亚洲二区在线观看| 在线日韩国产网站| 久久久久九九视频| 男女性杂交内射妇女bbwxz| 欧美aaaaaa午夜精品| 亚洲综合网中心| 日韩动漫一区| 亚洲一区中文字幕| 久久亚洲精品中文字幕| 国产91精品不卡视频| 巨骚激情综合| 欧美三级在线视频| 99久在线精品99re8热| 亚洲女女做受ⅹxx高潮| 女女互磨互喷水高潮les呻吟| 香蕉国产精品偷在线观看不卡| 欧美日韩一区在线视频| 中文字幕一区二区三区中文字幕 | 欧美momandson| 欧美黑人视频一区| 最新国产露脸在线观看| xxx一区二区| a视频网址在线观看| 国产丝袜一区二区三区免费视频| 亚洲精品毛片一区二区三区| 天天综合天天综合色| 黄色一级视频在线观看| 亚洲欧洲成人精品av97| 国产精品久久免费观看| 国产精品一二三在| 亚洲综合20p| 精彩视频一区二区| 日本中文字幕二区| 亚洲久久视频| 日韩精品一区二区免费| 欧美日韩在线二区| 日韩av电影免费在线| 亚洲欧洲色图| 久久综合久久久| 国产一区二区三区亚洲综合| 91极品视频在线| 多野结衣av一区| 91福利视频网| 在线观看欧美日韩电影| 琪琪第一精品导航| 欧美××××黑人××性爽 | 国内精品福利| 91免费国产精品| 国产精品theporn| 久久在线中文字幕| 福利电影一区| 国产精品久久久久久超碰| 成人日韩在线观看| 国产精品日韩一区| 亚洲精品乱码日韩| 91精品免费久久久久久久久| 电影一区中文字幕| 99电影在线观看| 欧美美女黄色| 欧美日韩国产一二| 北条麻妃在线一区二区免费播放 | 久久久久久久网| 实拍女处破www免费看| 国产欧美一区二区精品性色超碰| 亚洲一级Av无码毛片久久精品| 精品中文av资源站在线观看| 91香蕉视频免费看| 成人av高清在线| 播金莲一级淫片aaaaaaa| 国产日韩欧美不卡在线| 秋霞欧美一区二区三区视频免费| 久久精品亚洲精品国产欧美kt∨ | 国产天堂亚洲国产碰碰| 亚洲一级理论片| 久久久精品中文字幕麻豆发布| 老司机午夜免费福利| 久久久久国产精品麻豆ai换脸| 四季av综合网站| 国产网站一区二区| 91狠狠综合久久久| 黑人巨大精品欧美一区二区三区| 久久综合加勒比| 色综合激情五月| 国产福利资源在线| 这里只有精品免费| 神马一区二区三区| 最近2019年日本中文免费字幕| 国产精品麻豆一区二区三区| 久久成人亚洲精品| 国产1区在线| 欧美一级免费看| 国产精品久久久久久av公交车| 成人免费看黄网站| 色狼人综合干| 992tv快乐视频| 肉肉av福利一精品导航| 色婷婷狠狠18禁久久| 久久精品欧美一区二区三区麻豆| 亚洲精品乱码久久久久久久久久久久| 91免费国产在线观看| 久久精品亚洲a| 欧美性生活大片免费观看网址| 国产美女激情视频| 色婷婷精品大视频在线蜜桃视频| 黄色在线免费观看| 欧美哺乳videos| 免费不卡视频| 国产不卡av在线| 久久久久影视| 波多野结衣激情| 日韩国产欧美一区二区三区| 91porn在线| 亚洲欧洲色图综合| 国产第一页在线观看| 欧美老女人第四色| 欧美少妇另类| 日韩中文在线观看| 天堂av资源在线观看| 国产精品一区二区女厕厕| 在线视频亚洲专区| 国产资源在线视频| 成人免费视频app| 国产一区二区播放| 欧美午夜片在线观看| 欧美理论在线观看| 国产91精品久久久久久| 国产福利一区二区精品秒拍| 妞干网这里只有精品| 亚洲网址在线| 男男受被啪到高潮自述| 1024成人网| 日韩欧美a级片| 亚洲成人av在线| 激情av在线| 成人91视频| 欧美日韩第一区| 四川一级毛毛片| 久久中文娱乐网| 欧美bbbbbbbbbbbb精品| 亚洲国产精品免费| 欧美日韩视频在线播放| 国产精品视频在线观看| 日产精品一区二区| 精品少妇一区二区三区在线| 成人中文字幕电影| 日本熟妇毛耸耸xxxxxx| 亚洲成人1234| 超碰一区二区| 99热最新在线| 亚洲午夜精品久久久久久app| 日韩大片一区二区| 国产精品无遮挡| 国产精品人妻一区二区三区| 久久中文久久字幕| 亚洲爱爱视频| 日本不卡一区二区三区四区| 国产一区二区三区在线观看免费 | 亚洲欧美日韩在线| 国产普通话bbwbbwbbw| 91麻豆精品国产| 可以在线观看的av网站| 欧美激情精品久久久久| 99a精品视频在线观看| av高清在线免费观看| 91色九色蝌蚪| 特级西西444www高清大视频| 日韩在线国产精品| 欧美三级一区| 成人一对一视频| 成人sese在线| 日本天堂中文字幕| 亚洲白虎美女被爆操| 三上悠亚亚洲一区| 精品国产三级a在线观看| 欧美色图另类小说| 国产成人精品免费网站| 萌白酱视频在线| 日韩一区二区在线看| 97天天综合网| 婷婷亚洲婷婷综合色香五月| 国产在线国偷精品产拍免费yy| 欧美极品jizzhd欧美18| 欧美一区2区视频在线观看| 狠狠操一区二区三区| 婷婷五月色综合| 丁香六月综合激情| 亚洲永久精品一区| 欧美猛交ⅹxxx乱大交视频| 亚洲激情77| 亚洲av毛片在线观看| 欧美香蕉大胸在线视频观看| 日本www在线观看视频| 精品日韩美女| 国内一区二区视频| 特级毛片www| 欧美成人中文字幕在线| 欧美美女在线| 91精品视频国产| 一本久久a久久精品亚洲| 97超碰在线公开在线看免费| 免费av在线一区二区|