欧美日日操,日日爱网站,99久久久久久久,日本高清不卡免费,久久免费观看国产精品,秋霞在线观看视频一区二区三区

始創于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊有禮 登錄
  • 掛牌上市企業
  • 60秒人工響應
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補償
您的位置: 網站首頁 > 幫助中心>文章內容

細說多線程(四)—— CLR線程池的工作者線程

發布時間:  2012/9/16 6:35:10

目錄

一、線程的定義

二、線程的基礎知識

三、以ThreadStart方式實現多線程

四、CLR線程池的工作者線程

五、CLR線程池的I/O線程

六、異步 SqlCommand

七、并行編程與PLINQ

八、計時器與鎖

 

四、CLR線程池的工作者線程

4.1 關于CLR線程池

使用ThreadStart與ParameterizedThreadStart建立新線程非常簡單,但通過此方法建立的線程難于管理,若建立過多的線程反而會影響系統的性能。
有 見及此,.NET引入CLR線程池這個概念。CLR線程池并不會在CLR初始化的時候立刻建立線程,而是在應用程序要創建線程來執行任務時,線程池才初始 化一個線程。線程的初始化與其他的線程一樣。在完成任務以后,該線程不會自行銷毀,而是以掛起的狀態返回到線程池。直到應用程序再次向線程池發出請求時, 線程池里掛起的線程就會再度激活執行任務。這樣既節省了建立線程所造成的性能損耗,也可以讓多個任務反復重用同一線程,從而在應用程序生存期內節約大量開 銷。

注意:通過CLR線程池所建立的線程總是默認為后臺線程,優先級數為ThreadPriority.Normal。

 

4.2 工作者線程與I/O線程

CLR線程池分為工作者線程(workerThreads)與I/O線程 (completionPortThreads) 兩種,工作者線程是主要用作管理CLR內部對象的運作,I/O(Input/Output) 線程顧名思義是用于與外部系統交換信息,IO線程的細節將在下一節詳細說明。

通 過ThreadPool.GetMax(out int workerThreads,out int completionPortThreads )和 ThreadPool.SetMax( int workerThreads, int completionPortThreads)兩個方法可以分別讀取和設置CLR線程池中工作者線程與I/O線程的最大線程數。在 Framework2.0中最大線程默認為25*CPU數,在Framewok3.0、4.0中最大線程數默認為250*CPU數,在近年 I3,I5,I7 CPU出現后,線程池的最大值一般默認為1000、2000。
若想測試線程池中有多少的線程正在投入使用,可以通過ThreadPool.GetAvailableThreads( out int workerThreads,out int completionPortThreads ) 方法。

使用CLR線程池的工作者線程一般有兩種方式,一是直接通過 ThreadPool.QueueUserWorkItem() 方法,二是通過委托,下面將逐一細說。

 

4.3 通過QueueUserWorkItem啟動工作者線程

ThreadPool線程池中包含有兩個靜態方法可以直接啟動工作者線程:
一為 ThreadPool.QueueUserWorkItem(WaitCallback)
二為 ThreadPool.QueueUserWorkItem(WaitCallback,Object) 

先把WaitCallback委托指向一個帶有Object參數的無返回值方法,再使用 ThreadPool.QueueUserWorkItem(WaitCallback) 就可以異步啟動此方法,此時異步方法的參數被視為null 。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //把CLR線程池的最大值設置為1000
6 ThreadPool.SetMaxThreads(1000, 1000); 7 //顯示主線程啟動時線程池信息
8 ThreadMessage("Start"); 9 //啟動工作者線程
10 ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback)); 11 Console.ReadKey(); 12 } 13 14 static void AsyncCallback(object state) 15 { 16 Thread.Sleep(200); 17 ThreadMessage("AsyncCallback"); 18 Console.WriteLine("Async thread do work!"); 19 } 20 21 //顯示線程現狀
22 static void ThreadMessage(string data) 23 { 24 string message = string.Format("{0}\n CurrentThreadId is {1}", 25 data, Thread.CurrentThread.ManagedThreadId); 26 Console.WriteLine(message); 27 } 28 }

運行結果

 

使用 ThreadPool.QueueUserWorkItem(WaitCallback,Object) 方法可以把object對象作為參數傳送到回調函數中。
下面例子中就是把一個string對象作為參數發送到回調函數當中。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //把線程池的最大值設置為1000
6 ThreadPool.SetMaxThreads(1000, 1000); 7 8 ThreadMessage("Start"); 9 ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback),"Hello Elva"); 10 Console.ReadKey(); 11 } 12 13 static void AsyncCallback(object state) 14 { 15 Thread.Sleep(200); 16 ThreadMessage("AsyncCallback"); 17 18 string data = (string)state; 19 Console.WriteLine("Async thread do work!\n"+data); 20 } 21 22 //顯示線程現狀
23 static void ThreadMessage(string data) 24 { 25 string message = string.Format("{0}\n CurrentThreadId is {1}", 26 data, Thread.CurrentThread.ManagedThreadId); 27 Console.WriteLine(message); 28 } 29 }

運行結果

 

通 過ThreadPool.QueueUserWorkItem啟動工作者線程雖然是方便,但WaitCallback委托指向的必須是一個帶有 Object參數的無返回值方法,這無疑是一種限制。若方法需要有返回值,或者帶有多個參數,這將多費周折。有見及此,.NET提供了另一種方式去建立工 作者線程,那就是委托。

 

4.4  委托類       

使用CLR線程池中的工作者線程,最靈活最常用的方式就是使用委托的異步方法,在此先簡單介紹一下委托類。

當定義委托后,.NET就會自動創建一個代表該委托的類,下面可以用反射方式顯示委托類的方法成員(對反射有興趣的朋友可以先參考一下“.NET基礎篇——反射的奧妙”)

 1     class Program
 2     {
 3         delegate void MyDelegate();
 4 
 5         static void Main(string[] args)
 6         {
 7             MyDelegate delegate1 = new MyDelegate(AsyncThread);
 8             //顯示委托類的幾個方法成員     
9 var methods=delegate1.GetType().GetMethods(); 10 if (methods != null) 11 foreach (MethodInfo info in methods) 12 Console.WriteLine(info.Name); 13 Console.ReadKey(); 14 } 15 }

委托類包括以下幾個重要方法

1     public class MyDelegate:MulticastDelegate
2     {
3         public MyDelegate(object target, int methodPtr);
4         //調用委托方法
5 public virtual void Invoke(); 6 //異步委托
7 public virtual IAsyncResult BeginInvoke(AsyncCallback callback,object state); 8 public virtual void EndInvoke(IAsyncResult result); 9 }

當調用Invoke()方法時,對應此委托的所有方法都會被執行。而BeginInvoke與EndInvoke則支持委托方法的異步調用,由BeginInvoke啟動的線程都屬于CLR線程池中的工作者線程,在下面將詳細說明。

 

4.5  利用BeginInvoke與EndInvoke完成異步委托方法

首 先建立一個委托對象,通過IAsyncResult BeginInvoke(string name,AsyncCallback callback,object state) 異步調用委托方法,BeginInvoke 方法除最后的兩個參數外,其它參數都是與方法參數相對應的。通過 BeginInvoke 方法將返回一個實現了 System.IAsyncResult 接口的對象,之后就可以利用EndInvoke(IAsyncResult ) 方法就可以結束異步操作,獲取委托的運行結果。

 1     class Program
 2     {
 3         delegate string MyDelegate(string name);
 4 
 5         static void Main(string[] args)
 6         {
 7             ThreadMessage("Main Thread");
 8             
 9             //建立委托
10 MyDelegate myDelegate = new MyDelegate(Hello); 11 //異步調用委托,獲取計算結果
12 IAsyncResult result=myDelegate.BeginInvoke("Leslie", null, null); 13 //完成主線程其他工作
14 .............
15 //等待異步方法完成,調用EndInvoke(IAsyncResult)獲取運行結果
16 string data=myDelegate.EndInvoke(result); 17 Console.WriteLine(data); 18 19 Console.ReadKey(); 20 } 21 22 static string Hello(string name) 23 { 24 ThreadMessage("Async Thread"); 25 Thread.Sleep(2000); //虛擬異步工作 26 return "Hello " + name; 27 } 28 29 //顯示當前線程
30 static void ThreadMessage(string data) 31 { 32 string message = string.Format("{0}\n ThreadId is:{1}", 33 data,Thread.CurrentThread.ManagedThreadId); 34 Console.WriteLine(message); 35 } 36 }

運行結果

 

4.6  善用IAsyncResult

在 以上例子中可以看見,如果在使用myDelegate.BeginInvoke后立即調用myDelegate.EndInvoke,那在異步線程未完成 工作以前主線程將處于阻塞狀態,等到異步線程結束獲取計算結果后,主線程才能繼續工作,這明顯無法展示出多線程的優勢。此時可以好好利用 IAsyncResult 提高主線程的工作性能,IAsyncResult有以下成員:

1 public interface IAsyncResult
2 {
3     object AsyncState {get;}            //獲取用戶定義的對象,它限定或包含關于異步操作的信息。
4     WailHandle AsyncWaitHandle {get;}   //獲取用于等待異步操作完成的 WaitHandle。
5     bool CompletedSynchronously {get;}  //獲取異步操作是否同步完成的指示。
6     bool IsCompleted {get;}             //獲取異步操作是否已完成的指示。
7 }

通過輪詢方式,使用IsCompleted屬性判斷異步操作是否完成,這樣在異步操作未完成前就可以讓主線程執行另外的工作。

 1     class Program
 2     {
 3         delegate string MyDelegate(string name);
 4 
 5         static void Main(string[] args)
 6         {
 7             ThreadMessage("Main Thread");
 8             
 9             //建立委托
10 MyDelegate myDelegate = new MyDelegate(Hello); 11 //異步調用委托,獲取計算結果
12 IAsyncResult result=myDelegate.BeginInvoke("Leslie", null, null); 13 //在異步線程未完成前執行其他工作
14 while (!result.IsCompleted) 15 { 16 Thread.Sleep(200); //虛擬操作 17 Console.WriteLine("Main thead do work!"); 18 } 19 string data=myDelegate.EndInvoke(result); 20 Console.WriteLine(data); 21 22 Console.ReadKey(); 23 } 24 25 static string Hello(string name) 26 { 27 ThreadMessage("Async Thread"); 28 Thread.Sleep(2000); 29 return "Hello " + name; 30 } 31 32 static void ThreadMessage(string data) 33 { 34 string message = string.Format("{0}\n ThreadId is:{1}", 35 data,Thread.CurrentThread.ManagedThreadId); 36 Console.WriteLine(message); 37 } 38 }

運行結果:

 

除 此以外,也可以使用WailHandle完成同樣的工作,WaitHandle里面包含有一個方法WaitOne(int timeout),它可以判斷委托是否完成工作,在工作未完成前主線程可以繼續其他工作。運行下面代碼可得到與使用 IAsyncResult.IsCompleted 同樣的結果,而且更簡單方便 。

 1 namespace Test
 2 {
 3     class Program
 4     {
 5         delegate string MyDelegate(string name);
 6 
 7         static void Main(string[] args)
 8         {
 9             ThreadMessage("Main Thread");
10             
11             //建立委托
12 MyDelegate myDelegate = new MyDelegate(Hello); 13 14 //異步調用委托,獲取計算結果
15 IAsyncResult result=myDelegate.BeginInvoke("Leslie", null, null); 16 17 while (!result.AsyncWaitHandle.WaitOne(200)) 18 { 19 Console.WriteLine("Main thead do work!"); 20 } 21 string data=myDelegate.EndInvoke(result); 22 Console.WriteLine(data); 23 24 Console.ReadKey(); 25 } 26 27 static string Hello(string name) 28 { 29 ThreadMessage("Async Thread"); 30 Thread.Sleep(2000); 31 return "Hello " + name; 32 } 33 34 static void ThreadMessage(string data) 35 { 36 string message = string.Format("{0}\n ThreadId is:{1}", 37 data,Thread.CurrentThread.ManagedThreadId); 38 Console.WriteLine(message); 39 } 40 }

當要監視多個運行對象的時候,使用IAsyncResult.WaitHandle.WaitOne可就派不上用場了。
幸好.NET為WaitHandle準備了另外兩個靜態方法:WaitAny(waitHandle[], int)與WaitAll (waitHandle[] , int)。
其中WaitAll在等待所有waitHandle完成后再返回一個bool值。
而WaitAny是等待其中一個waitHandle完成后就返回一個int,這個int是代表已完成waitHandle在waitHandle[]中的數組索引。
下面就是使用WaitAll的例子,運行結果與使用 IAsyncResult.IsCompleted 相同。

 1     class Program
 2     {
 3         delegate string MyDelegate(string name);
 4 
 5         static void Main(string[] args)
 6         {
 7             ThreadMessage("Main Thread");
 8             
 9             //建立委托
10 MyDelegate myDelegate = new MyDelegate(Hello); 11 12 //異步調用委托,獲取計算結果
13 IAsyncResult result=myDelegate.BeginInvoke("Leslie", null, null); 14 15 //此處可加入多個檢測對象
16 WaitHandle[] waitHandleList = new WaitHandle[] { result.AsyncWaitHandle,........ }; 17 while (!WaitHandle.WaitAll(waitHandleList,200)) 18 { 19 Console.WriteLine("Main thead do work!"); 20 } 21 string data=myDelegate.EndInvoke(result); 22 Console.WriteLine(data); 23 24 Console.ReadKey(); 25 } 26 27 static string Hello(string name) 28 { 29 ThreadMessage("Async Thread"); 30 Thread.Sleep(2000); 31 return "Hello " + name; 32 } 33 34 static void ThreadMessage(string data) 35 { 36 string message = string.Format("{0}\n ThreadId is:{1}", 37 data,Thread.CurrentThread.ManagedThreadId); 38 Console.WriteLine(message); 39 } 40 }

 


4.7 回調函數

使 用輪詢方式來檢測異步方法的狀態非常麻煩,而且效率不高,有見及此,.NET為 IAsyncResult BeginInvoke(AsyncCallback , object)準備了一個回調函數。使用 AsyncCallback 就可以綁定一個方法作為回調函數,回調函數必須是帶參數 IAsyncResult 且無返回值的方法: void AsycnCallbackMethod(IAsyncResult result) 。在BeginInvoke方法完成后,系統就會調用AsyncCallback所綁定的回調函數,最后回調函數中調用 XXX EndInvoke(IAsyncResult result) 就可以結束異步方法,它的返回值類型與委托的返回值一致。

 1     class Program
 2     {
 3         delegate string MyDelegate(string name);
 4 
 5         static void Main(string[] args)
 6         {
 7             ThreadMessage("Main Thread");
 8 
 9             //建立委托
10 MyDelegate myDelegate = new MyDelegate(Hello); 11 //異步調用委托,獲取計算結果
12 myDelegate.BeginInvoke("Leslie", new AsyncCallback(Completed), null); 13 //在啟動異步線程后,主線程可以繼續工作而不需要等待
14 for (int n = 0; n < 6; n++) 15 Console.WriteLine(" Main thread do work!"); 16 Console.WriteLine(""); 17 18 Console.ReadKey(); 19 } 20 21 static string Hello(string name) 22 { 23 ThreadMessage("Async Thread"); 24 Thread.Sleep(2000); \\模擬異步操作 25 return "\nHello " + name; 26 } 27 28 static void Completed(IAsyncResult result) 29 { 30 ThreadMessage("Async Completed"); 31 32 //獲取委托對象,調用EndInvoke方法獲取運行結果
33 AsyncResult _result = (AsyncResult)result; 34 MyDelegate myDelegate = (MyDelegate)_result.AsyncDelegate; 35 string data = myDelegate.EndInvoke(_result); 36 Console.WriteLine(data); 37 } 38 39 static void ThreadMessage(string data) 40 { 41 string message = string.Format("{0}\n ThreadId is:{1}", 42 data, Thread.CurrentThread.ManagedThreadId); 43 Console.WriteLine(message); 44 } 45 }


可以看到,主線在調用BeginInvoke方法可以繼續執行其他命令,而無需再等待了,這無疑比使用輪詢方式判斷異步方法是否完成更有優勢。
在異步方法執行完成后將會調用AsyncCallback所綁定的回調函數,注意一點,回調函數依然是在異步線程中執行,這樣就不會影響主線程的運行,這也使用回調函數最值得青昧的地方。
在回調函數中有一個既定的參數IAsyncResult,把IAsyncResult強制轉換為AsyncResult后,就可以通過 AsyncResult.AsyncDelegate 獲取原委托,再使用EndInvoke方法獲取計算結果。
運行結果如下:


如 果想為回調函數傳送一些外部信息,就可以利用BeginInvoke(AsyncCallback,object)的最后一個參數object,它允許外 部向回調函數輸入任何類型的參數。只需要在回調函數中利用 AsyncResult.AsyncState 就可以獲取object對象。

 1     class Program
 2     {
 3         public class Person
 4         {
 5             public string Name;
 6             public int Age;
 7         }
 8 
 9         delegate string MyDelegate(string name);
10 
11         static void Main(string[] args)
12         {
13             ThreadMessage("Main Thread");
14 
15             //建立委托
16 MyDelegate myDelegate = new MyDelegate(Hello); 17 18 //建立Person對象
19 Person person = new Person(); 20 person.Name = "Elva"; 21 person.Age = 27; 22 23 //異步調用委托,輸入參數對象person, 獲取計算結果
24 myDelegate.BeginInvoke("Leslie", new AsyncCallback(Completed), person); 25 26 //在啟動異步線程后,主線程可以繼續工作而不需要等待
27 for (int n = 0; n < 6; n++) 28 Console.WriteLine(" Main thread do work!"); 29 Console.WriteLine(""); 30 31 Console.ReadKey(); 32 } 33 34 static string Hello(string name) 35 { 36 ThreadMessage("Async Thread"); 37 Thread.Sleep(2000); 38 return "\nHello " + name; 39 } 40 41 static void Completed(IAsyncResult result) 42 { 43 ThreadMessage("Async Completed"); 44 45 //獲取委托對象,調用EndInvoke方法獲取運行結果
46 AsyncResult _result = (AsyncResult)result; 47 MyDelegate myDelegate = (MyDelegate)_result.AsyncDelegate; 48 string data = myDelegate.EndInvoke(_result); 49 //獲取Person對象
50 Person person = (Person)result.AsyncState; 51 string message = person.Name + "'s age is " + person.Age.ToString(); 52 53 Console.WriteLine(data+"\n"+message); 54 } 55 56 static void ThreadMessage(string data) 57 { 58 string message = string.Format("{0}\n ThreadId is:{1}", 59 data, Thread.CurrentThread.ManagedThreadId); 60 Console.WriteLine(message); 61 } 62 } 億恩-天使(QQ:530997) 電話 037160135991 服務器租用,托管歡迎咨詢。

本文出自:億恩科技【www.sunshares.net】

服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經營性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經營性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經營性ICP/ISP證:贛B2-20080012
  • 服務器/云主機 24小時售后服務電話:0371-60135900
  • 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
  • 專注服務器托管17年
    掃掃關注-微信公眾號
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區翠竹街1號總部企業基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網安備41019702002023號
      0
     
     
     
     

    0371-60135900
    7*24小時客服服務熱線

     
     
    日韩中文字幕在线观看视频| 国产一区二区精品尤物| 久久国产精品永久免费网站| 精品美女| 欧美1区| 中文字幕一区二区三区 精品| 久久国产精品自线拍免费| 精品视频在线观看一区二区 | 欧美激情一区二区三区视频高清| 日韩在线观看免费| 久草免费资源| 精品视频免费在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 一级毛片看真人在线视频| a级毛片免费观看网站| 日韩在线观看视频黄| a级精品九九九大片免费看| 日韩在线观看视频免费| 欧美另类videosbestsex视频| 国产精品自拍在线| 亚欧视频在线| 日韩一级黄色| 精品国产一区二区三区久 | 国产极品精频在线观看| 日本乱中文字幕系列| 日韩欧美一二三区| 国产a网| 国产高清在线精品一区a| 欧美a级片视频| 中文字幕一区二区三区精彩视频 | 国产精品自拍亚洲| 99久久精品国产麻豆| 国产亚洲精品成人a在线| 国产亚洲精品成人a在线| 久久久久久久久综合影视网| 香蕉视频三级| 黄色免费网站在线| 国产精品12| 成人免费网站视频ww| 精品视频在线观看视频免费视频| 深夜做爰性大片中文| 九九热国产视频| 99久久精品国产片| 国产91精品一区| 精品国产一区二区三区久久久狼| 黄视频网站免费观看| 精品久久久久久中文字幕一区| 日本在线www| 久久国产一区二区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产视频网站在线观看| 精品久久久久久免费影院| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 999精品在线| 国产不卡在线播放| 国产网站麻豆精品视频| 色综合久久天天综合绕观看| 亚洲 激情| 国产一区二区高清视频| 美女免费精品高清毛片在线视| 91麻豆精品国产高清在线| 久草免费在线色站| 欧美一级视频免费| 精品视频在线看| 亚洲 欧美 91| 精品视频一区二区三区免费| 青青青草影院 | 精品视频在线观看一区二区 | 精品在线免费播放| 国产伦精品一区二区三区无广告| 国产一区二区精品久久91| 欧美日本韩国| 成人免费高清视频| 精品国产三级a| 四虎论坛| 亚洲 激情| 日日日夜夜操| 国产综合91天堂亚洲国产| 99热精品在线| 99久久精品国产高清一区二区 | 国产伦精品一区二区三区在线观看| 国产欧美精品| 国产高清视频免费观看| 亚欧成人乱码一区二区| 国产成人啪精品视频免费软件| 欧美a级成人淫片免费看| 精品国产香蕉伊思人在线又爽又黄| 亚欧成人乱码一区二区| 99色精品| 在线观看成人网 | 欧美一级视频免费| 九九九在线视频| 日本特黄特色aa大片免费| 精品国产三级a∨在线观看| 色综合久久天天综合观看| 亚洲天堂免费观看| 二级片在线观看| 亚洲第一页乱| 欧美日本免费| 天天做人人爱夜夜爽2020毛片| 日韩在线观看视频黄| 青青青草影院| 麻豆网站在线看| 韩国三级香港三级日本三级la| 国产成人精品综合久久久| 精品久久久久久中文字幕一区| 日本免费区| 久草免费在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 91麻豆精品国产片在线观看| 国产高清视频免费| 日本在线www| 免费的黄视频| 亚洲第一视频在线播放| 国产不卡在线看| 日本免费乱理伦片在线观看2018| 日韩中文字幕一区| 91麻豆tv| 亚洲精品影院久久久久久| 午夜在线亚洲| 亚欧乱色一区二区三区| 一级女性全黄久久生活片| 久久国产一区二区| 精品视频免费看| 香蕉视频久久| 国产一区二区精品尤物| 国产一区二区精品久久91| 精品国产一区二区三区久| 中文字幕一区二区三区精彩视频 | 精品视频在线观看一区二区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久久国产精品自由自在| 国产不卡在线看| 国产成+人+综合+亚洲不卡| 免费国产在线视频| 99久久精品国产高清一区二区 | 久久福利影视| 天天做日日爱| 久久国产精品只做精品| 精品国产亚洲一区二区三区| 青青青草影院 | 国产不卡精品一区二区三区| 青青久久精品| 亚洲第一页乱| 国产原创视频在线| 99色精品| 中文字幕Aⅴ资源网| 成人影视在线播放| 久久精品大片| 韩国三级视频网站| 国产伦精品一区三区视频| 欧美日本二区| 国产a网| 欧美a级成人淫片免费看| 四虎论坛| 成人影院一区二区三区| 美女免费毛片| 黄视频网站免费| 国产a视频| 国产91视频网| 韩国妈妈的朋友在线播放| 成人免费观看的视频黄页| 国产一区二区福利久久| 国产伦精品一区二区三区无广告| 日本免费乱理伦片在线观看2018| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 超级乱淫黄漫画免费| 国产美女在线一区二区三区| 美女免费毛片| 国产美女在线一区二区三区| 亚洲爆爽| 香蕉视频三级| 日韩男人天堂| 成人免费高清视频| 台湾毛片| 中文字幕97| 99久久精品国产高清一区二区 | 欧美国产日韩在线| 日韩欧美一及在线播放| 91麻豆爱豆果冻天美星空| 在线观看成人网 | 亚州视频一区二区| 亚洲 欧美 91| 毛片高清| 成人免费网站视频ww| 四虎精品在线观看| 日本特黄一级| 久久久成人网| 国产视频网站在线观看| 免费的黄色小视频| 欧美爱色| 在线观看导航| 国产视频久久久| 麻豆系列 在线视频| 黄视频网站在线免费观看| 欧美激情一区二区三区在线| 999精品在线| 韩国三级香港三级日本三级| 你懂的福利视频| 成人免费观看的视频黄页|