日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

一文带你搞懂C#多线程的5种写法

發(fā)布時(shí)間:2024/1/8 C# 85 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文带你搞懂C#多线程的5种写法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一文帶你搞懂C#多線程的5種寫法

1.簡(jiǎn)介

超長(zhǎng)警告!
在學(xué)習(xí)本篇文章前你需要學(xué)習(xí)的相關(guān)知識(shí):
線程基本知識(shí)

此篇文章簡(jiǎn)單總結(jié)了C#中主要的多線程實(shí)現(xiàn)方法,包括:

  • Thread
    線程
  • ThreadPool
    線程池
  • Parallel
  • Task
    任務(wù)
  • BackgroundWorker組件

2. Thread類

2.1 概述

  • 使用Thread類通過(guò)ThreadStart(無(wú)參數(shù))或ParameterizedThreadStart(一個(gè)輸入?yún)?shù))類型的委托創(chuàng)建一個(gè)Thread對(duì)象,開啟一個(gè)新線程,執(zhí)行該委托傳遞的任務(wù),此時(shí)線程尚未處于運(yùn)行狀態(tài)。

  • 調(diào)用Start()函數(shù)啟動(dòng)線程,當(dāng)前線程繼續(xù)執(zhí)行。

  • 調(diào)用Join()函數(shù)可以阻塞當(dāng)前線程,直到調(diào)用Join()的線程終止。

  • 調(diào)用Abort()方法,如需中止線程,在調(diào)用該方法的線程上拋出ThreadAbortException異常,以結(jié)束該線程

  • 可以通過(guò)Thread.ResetAbort()方法阻止線程的中止。

2.1 屬性表

屬性說(shuō)明
Name屬性,獲取或設(shè)置線程的名稱
Priority屬性,獲取或設(shè)置線程的優(yōu)先級(jí)
ThreadState屬性,獲取線程當(dāng)前的狀態(tài)
IsAlive屬性,獲取當(dāng)前線程是否處于啟動(dòng)狀態(tài)
IsBackground屬性,獲取或設(shè)置值,表示該線程是否為后臺(tái)線程
CurrentThread屬性,獲取當(dāng)前正在運(yùn)行的線程

2.2 方法表

方法說(shuō)明
Start()方法,啟動(dòng)線程
Sleep(int millisecondsTimout)方法,將當(dāng)前線程暫停指定的毫秒數(shù)
Suspend()方法,掛起當(dāng)前線程(已經(jīng)被棄用)
Join()方法,阻塞調(diào)用線程,直到某個(gè)線程終止為止
Interrupt()方法,中斷當(dāng)前線程
Resume()方法,繼續(xù)已經(jīng)掛起的線程(已經(jīng)被棄用)
Abort()方法,終止線程(已經(jīng)被棄用)

2.3 開啟線程

首先用new申請(qǐng)Thread對(duì)象,然后對(duì)象調(diào)用Start()方法啟用線程。

代碼如下所示:

class Program {static void DownLoad(){Console.WriteLine("DownLoad Begin " + Thread.CurrentThread.ManagedThreadId);Thread.Sleep(1000);Console.WriteLine("DownLoad End");}static void Main(string[] args){//創(chuàng)建Thread對(duì)象Thread thread = new Thread(DownLoad);//啟動(dòng)線程thread.Start();Console.WriteLine("Main");Console.ReadKey();} }

Thread.CurrentThread.ManagedThreadId獲取當(dāng)前線程的ID,便于管理。

用Lambda表達(dá)式代替函數(shù)調(diào)用,也能達(dá)到相同的效果

class Program {static void Main(string[] args){Thread thread = new Thread(() =>{Console.WriteLine("DownLoad Begin " + Thread.CurrentThread.ManagedThreadId);Thread.Sleep(1000);Console.WriteLine("DownLoad End");});thread.Start();Console.WriteLine("Main");Console.ReadKey();} }

2.4 傳遞參數(shù)

有兩種為線程傳遞參數(shù)的方法:

  • Start()函數(shù)傳參法
  • 對(duì)象成員方法傳參法
  • 匿名方法傳參法

2.4.1 Start()函數(shù)傳參

為某方法創(chuàng)建新線程后,在使用Start()方法啟動(dòng)線程時(shí)傳遞該方法需要的參數(shù)。

代碼如下:

class Program {static void DownLoad(object name){Console.WriteLine("DownLoad Begin " + name);Thread.Sleep(1000);Console.WriteLine("DownLoad End");}static void Main(string[] args){//創(chuàng)建Thread對(duì)象Thread thread = new Thread(DownLoad);//啟動(dòng)線程thread.Start("April");Console.WriteLine("Main");Console.ReadKey();}

2.4.1 對(duì)象傳遞

初始化一個(gè)對(duì)象,然后用對(duì)象的方法初始化Thread,這樣該線程就可以使用這個(gè)對(duì)象的所有成員。

class Program {public class Download{private int Id;private string Name;public Download(int id, string name){Id = id;Name = name;}public void DownloadFile(){Console.WriteLine("DownLoad Begin " + "ID: " + Id + " Name: " + Name);Thread.Sleep(1000);Console.WriteLine("DownLoad End"); }}static void Main(string[] args){Download download = new Download(1, "人民日?qǐng)?bào)");Thread thread = new Thread(download.DownloadFile);thread.Start();Console.WriteLine("Main");Console.ReadKey();} }

2.4.5 匿名方法

需要接收多個(gè)參數(shù)的解決方案是使用一個(gè)匿名方法調(diào)用,方法如下

static void Main() { Thread t = new Thread(delegate() { WriteText ("Hello"); });t.Start();}static void WriteText (stringtext) { Console.WriteLine (text); }

它的優(yōu)點(diǎn)是目標(biāo)方法(這里是WriteText),可以接收任意數(shù)量的參數(shù),并且沒(méi)有裝箱操作。

不過(guò)這需要將一個(gè)外部變量放入到匿名方法中,如下示例:

static voidMain() { stringtext = "Before";Threadt = new Thread(delegate() { WriteText (text); });text = "After";t.Start();}static void WriteText (stringtext) { Console.WriteLine (text); }

需要注意的是:
當(dāng)外部變量的值被修改,匿名方法可能進(jìn)行無(wú)意的互動(dòng),導(dǎo)致一些古怪的現(xiàn)象。
一旦線程開始運(yùn)行,外部變量最好被處理成只讀的——除非有人愿意使用適當(dāng)?shù)逆i。

2.5 線程命名

線程可以通過(guò)它的Name屬性進(jìn)行命名,這非常有利于調(diào)試:
可以用Console.WriteLine打印出線程的名字
Microsoft Visual Studio可以將線程的名字顯示在調(diào)試工具欄的位置上。

線程的名字可以在被任何時(shí)間設(shè)置——但只能設(shè)置一次,重命名會(huì)引發(fā)異常。

程序的主線程也可以被命名,下面例子里主線程通過(guò)CurrentThread命名:

Class ThreadNaming { static void Main() { Thread.CurrentThread.Name= "main";Thread worker = new Thread(Go);worker.Name= "worker";worker.Start();Go();}static void Go() { Console.WriteLine ("Hello from "+ Thread.CurrentThread.Name);}}

輸出

Hellofrom main

Hellofrom worker

2.6 前臺(tái)線程和后臺(tái)線程

  • 前臺(tái)線程(用戶界面線程)
    只要存在有一個(gè)前臺(tái)線程在運(yùn)行,應(yīng)用程序就在運(yùn)行
    通常用來(lái)處理用戶的輸入并響應(yīng)各種事件和消息
  • 后臺(tái)線程(工作線程)
    應(yīng)用程序關(guān)閉時(shí),如果后臺(tái)線程沒(méi)有執(zhí)行完,會(huì)被強(qiáng)制性的關(guān)閉
    用來(lái)執(zhí)行程序的后臺(tái)處理任務(wù),比如計(jì)算、調(diào)度、對(duì)串口的讀寫操作等

例如:

class Program {static void DownLoad(){Console.WriteLine("DownLoad Begin " + Thread.CurrentThread.ManagedThreadId);Thread.Sleep(1000);Console.WriteLine("DownLoad End");}static void Main(string[] args){//創(chuàng)建Thread對(duì)象Thread thread = new Thread(DownLoad);//設(shè)為后臺(tái)線程thread.IsBackground = true;//啟動(dòng)線程thread.Start();Console.WriteLine("Main");} }

在上例中,thread被設(shè)置為后臺(tái)線程。
Main執(zhí)行完后,沒(méi)有前臺(tái)線程了,應(yīng)用程序就結(jié)束,雖然后臺(tái)線程thread此時(shí)尚未執(zhí)行完,也被終止。

改變線程從前臺(tái)到后臺(tái)不會(huì)以任何方式改變它在CPU協(xié)調(diào)程序中的優(yōu)先級(jí)和狀態(tài)。

擁有一個(gè)后臺(tái)工作線程是有益的,
最直接的理由是當(dāng)提到結(jié)束程序它總是可能有最后的發(fā)言權(quán)。
交織以不會(huì)消亡的前臺(tái)線程,保證程序的正常退出。

拋棄一個(gè)前臺(tái)工作線程是尤為險(xiǎn)惡的,尤其對(duì)Windows Forms程序,
因?yàn)槌绦蛑钡街骶€程結(jié)束時(shí)才退出(至少對(duì)用戶來(lái)說(shuō)),但是它的進(jìn)程仍然運(yùn)行著。
在Windows任務(wù)管理器它將從應(yīng)用程序欄消失不見,但卻可以在進(jìn)程欄找到它。
除非用戶找到并結(jié)束它,它將繼續(xù)消耗資源,并可能阻止一個(gè)新的實(shí)例的運(yùn)行從開始或影響它的特性。

對(duì)于程序失敗退出的普遍原因就是存在“被忘記”的前臺(tái)線程。

線程類型動(dòng)作結(jié)束后續(xù)處理
前臺(tái)線程主程序關(guān)閉顯示關(guān)閉線程/殺掉當(dāng)前進(jìn)程
后臺(tái)線程主程序關(guān)閉無(wú)

2.7 注意事項(xiàng)

  • Thread類創(chuàng)建的線程默認(rèn)為前臺(tái)線程,可以通過(guò)IsBackground屬性設(shè)置其為前臺(tái)或后臺(tái)線程。

    用Thread類創(chuàng)建的線程是前臺(tái)線程,線程池中的線程總是后臺(tái)線程

  • 可以通過(guò)Priority屬性設(shè)置線程的優(yōu)先級(jí)。

  • 線程內(nèi)部可以通過(guò)try catch捕獲該異常,在catch模塊中進(jìn)行一些必要的處理
    如釋放持有的鎖和文件資源等

  • 慎重使用Abort()方法
    如果在當(dāng)前線程中拋出該異常,其結(jié)果是可預(yù)測(cè)的
    但是對(duì)于其他線程,它會(huì)中斷任何正在執(zhí)行的代碼,有可能中斷靜態(tài)對(duì)象的生成,造成不可預(yù)測(cè)的結(jié)果。

3. 線程池

3.1 概述

ThreadPool類維護(hù)一個(gè)線程的列表,提供給用戶以執(zhí)行不同的小任務(wù),減少頻繁創(chuàng)建線程的開銷。
該線程池可用于執(zhí)行任務(wù)、發(fā)送工作項(xiàng)、處理異步 I/O、代表其他線程等待以及處理計(jì)時(shí)器。

線程池其實(shí)就是一個(gè)存放線程對(duì)象的“池子(pool)”,他提供了一些基本方法,如:設(shè)置pool中最小/最大線程數(shù)量、把要執(zhí)行的方法排入隊(duì)列等等。ThreadPool是一個(gè)靜態(tài)類,因此可以直接使用,不用創(chuàng)建對(duì)象。

3.2 線程池的優(yōu)點(diǎn)

每新建一個(gè)線程都需要占用內(nèi)存空間和其他資源
而新建了那么多線程,有很多在休眠,或者在等待資源釋放;
又有許多線程只是周期性的做一些小工作,如刷新數(shù)據(jù)等等,太浪費(fèi)了,劃不來(lái)。
實(shí)際編程中大量線程突發(fā),然后在短時(shí)間內(nèi)結(jié)束的情況很少見。

于是,就提出了線程池的概念。

線程池中的線程執(zhí)行完指定的方法后并不會(huì)自動(dòng)消除,而是以掛起狀態(tài)返回線程池,如果應(yīng)用程序再次向線程池發(fā)出請(qǐng)求,那么處以掛起狀態(tài)的線程就會(huì)被激活并執(zhí)行任務(wù),而不會(huì)創(chuàng)建新線程,這就節(jié)約了很多開銷。
只有當(dāng)線程數(shù)達(dá)到最大線程數(shù)量,系統(tǒng)才會(huì)自動(dòng)銷毀線程。

因此,使用線程池可以避免大量的創(chuàng)建和銷毀的開支,具有更好的性能和穩(wěn)定性,其次,開發(fā)人員把線程交給系統(tǒng)管理,可以集中精力處理其他任務(wù)。

3.3 線程池的使用

  • 設(shè)置線程池最大最小:
    ThreadPool.SetMaxThreads (int workerThreads,int completionPortThreads)
    設(shè)置可以同時(shí)處于活動(dòng)狀態(tài)的線程池的請(qǐng)求數(shù)目。
    所有大于此數(shù)目的請(qǐng)求將保持排隊(duì)狀態(tài),直到線程池線程變?yōu)榭捎谩?br /> 還可以設(shè)置最小線程數(shù)。

  • 將任務(wù)添加進(jìn)線程池:
    **ThreadPool.QueueUserWorkItem(new WaitCallback(方法名));**或
    ThreadPool.QueueUserWorkItem(new WaitCallback(方法名), 參數(shù));

但是線程池的使用也有一些限制:

  • 線程池中的線程均為后臺(tái)線程,并且不能修改為前臺(tái)線程
  • 不能給入池的線程設(shè)置優(yōu)先級(jí)或名稱
  • 對(duì)于COM對(duì)象,入池的所有線程都是多線程單元(MTA)線程,許多COM對(duì)象都需要單線程單元(STA) 線程
  • 入池的線程只適合時(shí)間較短的任務(wù),如果線程需要長(zhǎng)時(shí)間運(yùn)行,應(yīng)使用Thread類創(chuàng)建線程或使用Task的LongRunning選項(xiàng)
  • .Net下線程池最小默認(rèn)允許4個(gè)工作線程,最大允許2048個(gè)工作線程。
    并發(fā)線程啟動(dòng)后,瞬間會(huì)啟動(dòng)4個(gè)線程。
    而剩下的會(huì)依據(jù)環(huán)境每0.5秒或者1秒啟動(dòng)一個(gè)。
    如果同時(shí)運(yùn)行的線程達(dá)到Max工作線程,那么剩下的就會(huì)掛起
    直到線程池中的線程有空閑得了,才會(huì)去執(zhí)行。

4. Parallel類

4.1 概述

整理自https://blog.csdn.net/honantic/article/details/46876871

Parallel和Task類都位于System.Threading.Task命名空間中,是對(duì)Thread和ThreadPool類更高級(jí)的抽象。

Parrallel類有For()、ForEach()、Invoke()三個(gè)方法

  • Invoke()
    實(shí)現(xiàn)任務(wù)并行性
    允許同時(shí)調(diào)用不同的方法,

  • Parallel.For()和 Parallel.ForEach()
    實(shí)現(xiàn)數(shù)據(jù)并行性
    在每次迭代中調(diào)用相同的代碼

4.2 常用方法

4.2.1 Parallel.For()

Parallel.For()方法類似于 C#的 for循環(huán)語(yǔ)旬,也是多次執(zhí)行一個(gè)任務(wù)。
使用Parallel.For()方法,可以并行運(yùn)行迭代。

迭代的順序沒(méi)有定義,不能保證。

在For()方法中:

  • 前兩個(gè)參數(shù)定義了循環(huán)的開頭和結(jié)束。示例從0迭代到 9。
  • 第 3個(gè)參數(shù)是一個(gè)Action委托
    是要并行運(yùn)行迭代的方法
  • 整數(shù)參數(shù)是循環(huán)的迭代次數(shù),該參數(shù)被傳遞給Action委托引用的方法。
  • Parallel.For()方法的返回類型是ParalleLoopResult結(jié)構(gòu),它提供了循環(huán)是否結(jié)束的信息。

案例如下:

public static void Main(){ParallelLoopResult result = Parallel.For(0, 10, i =>{Console.WriteLine("i:{0}, thread id: {1}", i, Thread.CurrentThread.ManagedThreadId);Thread.Sleep(10);});Console.WriteLine("Is completed: {0}", result.IsCompleted);//i: 0, thread id: 9//i: 2, thread id: 10//i: 1, thread id: 9//i: 3, thread id: 10//i: 4, thread id: 9//i: 6, thread id: 11//i: 7, thread id: 10//i: 5, thread id: 9//i: 8, thread id: 12//i: 9, thread id: 11//Is completed: TrueConsole.ReadKey();}

同F(xiàn)or()循環(huán)類似,Parallel.For()方法也可以中斷循環(huán)的執(zhí)行。

Parallel.For()方法的一個(gè)重載版本接受第3個(gè)Action<int, ParallelLoopState>類型的參數(shù)。
使用這些參數(shù)定義一個(gè)方法,就可以調(diào)用ParalleLoopState的Break()或Stop()方法,以影響循環(huán)的結(jié)果。

注意,迭代的順序沒(méi)有定義

案例如下:

public static void Main(){ParallelLoopResult result = Parallel.For(0, 100, (i, state) =>{Console.WriteLine("i:{0}, thread id: {1}", i, Thread.CurrentThread.ManagedThreadId);if (i > 10)state.Break();Thread.Sleep(10);});Console.WriteLine("Is completed: {0}", result.IsCompleted);Console.WriteLine("Lowest break iteration: {0}", result.LowestBreakIteration);//i: 0, thread id: 10//i: 25, thread id: 6//i: 1, thread id: 10//i: 2, thread id: 10//i: 3, thread id: 10//i: 4, thread id: 10//i: 5, thread id: 10//i: 6, thread id: 10//i: 7, thread id: 10//i: 8, thread id: 10//i: 9, thread id: 10//i: 10, thread id: 10//i: 11, thread id: 10//Is completed: False//Lowest break iteration: 11Console.ReadKey();}

4.2.2 Parallel.For < TLocal >

Parallel.For()方法可能使用幾個(gè)線程來(lái)執(zhí)行循環(huán) 。

如果需要對(duì)每個(gè)線程進(jìn)行初始化,就可以使用Parallel.For方法。
除了from和to對(duì)應(yīng)的值之外,For()方法的泛型版本還接受3個(gè)委托參數(shù):

  • 第一個(gè)參數(shù)的類型是Func< TLocal >
    因?yàn)檫@里的例子對(duì)于TLocal使用字符串,所以該方法需要定義為Func< string >,即返回string的方法。
    這個(gè)方法僅對(duì)于用于執(zhí)行迭代的每個(gè)線程調(diào)用一次

  • 第二個(gè)委托參數(shù)為循環(huán)體定義了委托
    在示例中,該參數(shù)的類型是Func<int, ParallelLoopState, string, string>。
    其中第一個(gè)參數(shù)是循環(huán)迭代,第二個(gè)參數(shù) ParallelLoopstate允許停止循環(huán),如前所述 。
    循環(huán)體方法通過(guò)第3個(gè)參數(shù)接收從init方法返回的值,循環(huán)體方法還需要返回一個(gè)值,其類型是用泛型for參數(shù)定義的。

  • For()方法的最后一個(gè)參數(shù)指定一個(gè)委托Action< TLocal >;在該示例中,接收一個(gè)字符串。
    這個(gè)方法僅對(duì)于每個(gè)線程調(diào)用一次,這是一個(gè)線程退出方法。

案例如下:

Parallel.For<string>(0, 20,() =>{Console.WriteLine("init thread {0},\t task {1}", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);return string.Format("t{0}", Thread.CurrentThread.ManagedThreadId);},(i, pls, str) =>{Console.WriteLine("body i {0} \t str {1} \t thread {2} \t task {3}", i, str, Thread.CurrentThread.ManagedThreadId, Task.CurrentId);Thread.Sleep(10);return string.Format("i \t{0}", i);},(str) =>{Console.WriteLine("finally\t {0}", str);});Console.ReadKey();

Parallel.For 方法 (Int32, Int32, Func, Func<Int32, ParallelLoopState, TLocal, TLocal>, Action)

參數(shù)表:

參數(shù)名數(shù)據(jù)類型作用
TLoca線程本地?cái)?shù)據(jù)的類型
fromInclusiveSystem.Int32開始索引(含)
toExclusiveSystem.Int32結(jié)束索引(不含)
localInitSystem.Func用于返回每個(gè)任務(wù)的本地?cái)?shù)據(jù)的初始狀態(tài)的函數(shù)委托
bodySystem.Func<Int32, ParallelLoopState, TLocal, TLocal>將為每個(gè)迭代調(diào)用一次的委托
localFinallySystem.Action用于對(duì)每個(gè)任務(wù)的本地狀態(tài)執(zhí)行一個(gè)最終操作的委托
返回值System.Threading.Tasks.ParallelLoopResult

在迭代范圍 (fromInclusive,toExclusive) ,為每個(gè)值調(diào)用一次body 委托。
為它提供以下參數(shù):

  • 迭代次數(shù) (Int32)
  • 可用來(lái)提前退出循環(huán)的ParallelLoopState實(shí)例
  • 可以在同一線程上執(zhí)行的迭代之間共享的某些本地狀態(tài)。

對(duì)于參與循環(huán)執(zhí)行的每個(gè)任務(wù)調(diào)用 localInit 委托一次,并返回每個(gè)任務(wù)的初始本地狀態(tài)。
這些初始狀態(tài)傳遞給第一個(gè)在該任務(wù)上 調(diào)用的 body。
然后,每個(gè)后續(xù)正文調(diào)用返回可能修改過(guò)的狀態(tài)值,傳遞到下一個(gè)正文調(diào)用。
最后,每個(gè)任務(wù)上的最后正文調(diào)用返回傳遞給 localFinally 委托的狀態(tài)值。
每個(gè)任務(wù)調(diào)用 localFinally 委托一次,以對(duì)每個(gè)任務(wù)的本地狀態(tài)執(zhí)行最終操作。
此委托可以被多個(gè)任務(wù)同步調(diào)用;
因此您必須同步對(duì)任何共享變量的訪問(wèn)。

Parallel.For方法比在它執(zhí)行生存期的線程可能使用更多任務(wù),作為現(xiàn)有的任務(wù)完成并被新任務(wù)替換。
這使基礎(chǔ) TaskScheduler 對(duì)象有機(jī)會(huì)添加、更改或移除服務(wù)循環(huán)的線程。

如果 fromInclusive 大于或等于 toExclusive,則該方法立即返回,而無(wú)需執(zhí)行任何迭代。

4.2.3 Parallel.ForEach()

Parallel.ForEach()方法遍歷實(shí)現(xiàn)了IEnumerable的集合,其方式類似于foreach語(yǔ)句,但以異步方式遍歷。
這里也沒(méi)有確定遍歷順序。

string[] data = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" };ParallelLoopResult result = Parallel.ForEach<string>(data, (s) =>{Console.WriteLine(s);});Console.ReadKey();

中斷循環(huán)
如果需要中斷循環(huán),就可以使用ForEach()方法的重載版本和ParallelLoopState參數(shù)。其方式與前面的For()方法相同。
ForEach()方法的一個(gè)重載版本也可以用于訪問(wèn)索引器,從而獲得迭代次數(shù)
如下所示:

string[] data = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" };ParallelLoopResult result = Parallel.ForEach<string>(data, (s, pls, l) =>{Console.WriteLine("{0}\t{1}", s, l);if (l > 10){pls.Break();}});Console.WriteLine("Lowest break iteration: {0}", result.LowestBreakIteration);Console.ReadKey();

4.2.4 Parallel.Invoke()

如果多個(gè)任務(wù)應(yīng)并行運(yùn)行,就可以使用Parallel.Invoke()方法。
Parallel.Invoke()方法允許傳遞一個(gè)Action委托數(shù)組,在其中可以指定應(yīng)運(yùn)行的方法。
示例代碼傳遞了要并行調(diào)用的Foo()和Bar()方法:

static void Main(string[] args){Parallel.Invoke(Foo, Bar);Console.ReadKey();}static void Foo(){Console.WriteLine("Foo");}static void Bar(){Console.WriteLine("Bar");}

如需同時(shí)執(zhí)行多個(gè)不同的任務(wù),可以使用Parallel.Invoke()方法,它允許傳遞一個(gè)Action委托數(shù)組。

public static void Main(){Parallel.Invoke(Func1, Func2, Func3);Console.ReadKey();}

5. Task類

5.1 概述

相比于Thread類,Task類為控制線程提供了更大的靈活性。

  • Task類可以獲取線程的返回值

  • 可以定義連續(xù)的任務(wù):在一個(gè)任務(wù)結(jié)束結(jié)束后開啟下一個(gè)任務(wù)

  • 可以在層次結(jié)構(gòu)中安排任務(wù),在父任務(wù)中可以創(chuàng)建子任務(wù)
    這樣就創(chuàng)建了一種依賴關(guān)系,如果父任務(wù)被取消,子任務(wù)也隨之取消

注意:
Task類默認(rèn)使用線程池中的線程,如果該任務(wù)需長(zhǎng)期運(yùn)行,應(yīng)使用TaskCreationOptions.LongRunning屬性告訴任務(wù)管理器創(chuàng)建一個(gè)新的線程,而不是使用線程池中的線程。

5.2 任務(wù)Task和線程Thread的區(qū)別:

  • 任務(wù)是架構(gòu)在線程之上的
    也就是說(shuō)任務(wù)最終還是要拋給線程去執(zhí)行。
  • 任務(wù)跟線程不是一對(duì)一的關(guān)系
    比如開10個(gè)任務(wù)并不是說(shuō)會(huì)開10個(gè)線程,這一點(diǎn)任務(wù)有點(diǎn)類似線程池,但是任務(wù)相比線程池有很小的開銷和精確的控制。
  • Task和Thread一樣,位于System.Threading命名空間下!

5.3 Task的生存周期與狀態(tài)

狀態(tài)說(shuō)明
Created表示默認(rèn)初始化任務(wù),但是“工廠創(chuàng)建的”實(shí)例直接跳過(guò)。
WaitingToRun這種狀態(tài)表示等待任務(wù)調(diào)度器分配線程給任務(wù)執(zhí)行。
RanToCompletion任務(wù)執(zhí)行完畢。
//查看Task中的狀態(tài)var task1 = new Task(() =>{Console.WriteLine("Begin");System.Threading.Thread.Sleep(2000);Console.WriteLine("Finish");});Console.WriteLine("Before start:" + task1.Status);task1.Start();Console.WriteLine("After start:" + task1.Status);task1.Wait();Console.WriteLine("After Finish:" + task1.Status);

5.4 Task的使用方法

5.4.1 啟動(dòng)任務(wù)

以下程序演示了幾種通過(guò)Task類啟動(dòng)任務(wù)的方式:

  • 實(shí)例化后手動(dòng)start()

    var task1 = new Task(() =>{//TODO you code});task1.Start();
  • 使用Task工廠對(duì)象創(chuàng)建新任務(wù)并執(zhí)行

    TaskFactory tf = new TaskFactory(); Task t1 = tf.StartNew(TaskMethod.DoTask, "using a task factory");
  • 工廠創(chuàng)建,直接執(zhí)行

    Task t2 = Task.Factory.StartNew(TaskMethod.DoTask, "factory via a task");

案例如下:

public class ThreadExample{public static void Main(){TaskFactory tf = new TaskFactory();Task t1 = tf.StartNew(TaskMethod.DoTask, "using a task factory");Task t2 = Task.Factory.StartNew(TaskMethod.DoTask, "factory via a task");Task t3 = new Task(TaskMethod.DoTask, "using a task constructor and start");t3.Start();//需要.NetFramework 4.5以上var t4 = Task.Run(() => TaskMethod.DoTask("using Run method"));Console.ReadKey();}class TaskMethod{static object taskLock = new object();public static void DoTask(object msg){lock (taskLock){Console.WriteLine(msg);Console.WriteLine("Task id:{0}, Thread id :{1}",Task.CurrentId == null ? "no task" : Task.CurrentId.ToString(),Thread.CurrentThread.ManagedThreadId);}}}

5.4.2 任務(wù)控制

5.4.2.1 Task.Wait()

就是等待任務(wù)執(zhí)行(task1)完成,task1的狀態(tài)變?yōu)镃ompleted。

5.4.2.2 Task.WaitAll()

等待所有的任務(wù)都執(zhí)行完成:
例如:

Task.WaitAll(task,task2,task3...N) Console.WriteLine("All task finished!");

即當(dāng)task,task2,task3…N全部任務(wù)都執(zhí)行完成之后才會(huì)往下執(zhí)行代碼(打印出:“All task finished!”)

5.4.2.3 Task.WaitAny()

同Task.WaitAll,等待任何一個(gè)任務(wù)完成就繼續(xù)向下執(zhí)行,將上面的代碼WaitAll替換為WaitAny

Task.WaitAny(task,task2,task3...N) Console.WriteLine("Any task finished!");

即當(dāng)task,task2,task3…N任意一個(gè)任務(wù)都執(zhí)行完成之后就會(huì)往下執(zhí)行代碼(打印出:” Any task finished!”)

5.4.2.4 Task.ContinueWith()

在第一個(gè)Task完成后自動(dòng)啟動(dòng)下一個(gè)Task,實(shí)現(xiàn)Task的延續(xù),編寫如下代碼:

public static void Main(){TaskFactory tf = new TaskFactory();Task t1 = tf.StartNew(()=>{Console.WriteLine("Current Task id = {0}", Task.CurrentId);Console.WriteLine("執(zhí)行任務(wù)1\r\n");Thread.Sleep(10);});Task t2 = t1.ContinueWith((t) =>{Console.WriteLine("Last Task id = {0}", t.Id);Console.WriteLine("Current Task id = {0}", Task.CurrentId);Console.WriteLine("執(zhí)行任務(wù)2\r\n");Thread.Sleep(10);});Task t3 = t2.ContinueWith(delegate(Task t) {Console.WriteLine("Last Task id = {0}", t.Id);Console.WriteLine("Current Task id = {0}", Task.CurrentId);Console.WriteLine("執(zhí)行任務(wù)3\r\n");}, TaskContinuationOptions.OnlyOnRanToCompletion);Console.ReadKey(); }//執(zhí)行結(jié)果////Current Task id = 1//執(zhí)行任務(wù)1//Last Task id = 1//Current Task id = 2//執(zhí)行任務(wù)2//Last Task id = 2//Current Task id = 3//執(zhí)行任務(wù)3

從執(zhí)行結(jié)果可以看出,任務(wù)1,2,3被順序執(zhí)行,同時(shí)通過(guò) TaskContinuationOptions 還可以指定何種情況下繼續(xù)執(zhí)行該任務(wù),常用的值包括OnlyOnFaulted, OnlyOnCanceled, NotOnFaulted, NotOnCanceled等。如將上例中的OnlyOnRanToCompletion改為OnlyOnFaulted,任務(wù)2結(jié)束之后,任務(wù)3將不被執(zhí)行。

對(duì)于ContinueWith()的使用,MSDN演示了更加優(yōu)雅的“流式”調(diào)用方法:

private void Button1_Click(object sender, EventArgs e) { var backgroundScheduler = TaskScheduler.Default; var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(delegate { DoBackgroundComputation(); }, backgroundScheduler). ContinueWith(delegate { UpdateUI(); }, uiScheduler). ContinueWith(delegate { DoAnotherBackgroundComputation(); }, backgroundScheduler). ContinueWith(delegate { UpdateUIAgain(); }, uiScheduler); }

5.4.2.5 RunSynchronously()

用于實(shí)現(xiàn)同步調(diào)用,直接在當(dāng)前線程上調(diào)用該任務(wù)。

public static void Main(){TaskMethod.DoTask("Just Main thread");Task t1 = new Task(TaskMethod.DoTask, "using Run Sync");t1.RunSynchronously();//輸出結(jié)果//Just Main thread//Task id: no task, Thread id: 9////using Run Sync//Task id:1, Thread id :9}

5.4.3 任務(wù)取消

當(dāng)我們啟動(dòng)了一個(gè)task,出現(xiàn)異常或者用戶點(diǎn)擊取消等等,我們可以取消這個(gè)任務(wù)。

我們通過(guò)cancellation的tokens來(lái)取消一個(gè)Task。
在很多Task的Body里面包含循環(huán),我們可以在輪詢的時(shí)候判斷IsCancellationRequested屬性是否為True
如果是True的話就return或者拋出異常,拋出異常后面再說(shuō),因?yàn)檫€沒(méi)有說(shuō)異常處理的東西。

下面在代碼中看下如何實(shí)現(xiàn)任務(wù)的取消,代碼如下:

    var tokenSource = new CancellationTokenSource();var token = tokenSource.Token;var task = Task.Factory.StartNew(() =>{for (var i = 0; i < 1000; i++){System.Threading.Thread.Sleep(1000);if (token.IsCancellationRequested){Console.WriteLine("Abort mission success!");return;}}}, token);token.Register(() =>{Console.WriteLine("Canceled");});Console.WriteLine("Press enter to cancel task...");Console.ReadKey();tokenSource.Cancel();123456789101112131415161718192021

這里開啟了一個(gè)Task,并給token注冊(cè)了一個(gè)方法,輸出一條信息,然后執(zhí)行ReadKey開始等待用戶輸入,用戶點(diǎn)擊回車后,執(zhí)行tokenSource.Cancel方法,取消任務(wù)。

注意:
因?yàn)槿蝿?wù)通常運(yùn)行以異步方式在線程池線程上,創(chuàng)建并啟動(dòng)任務(wù)的線程將繼續(xù)執(zhí)行,一旦該任務(wù)已實(shí)例化。
在某些情況下,當(dāng)調(diào)用線程的主應(yīng)用程序線程,該應(yīng)用程序可能會(huì)終止之前任何任務(wù)實(shí)際開始執(zhí)行。
其他情況下,應(yīng)用程序的邏輯可能需要調(diào)用線程繼續(xù)執(zhí)行,僅當(dāng)一個(gè)或多個(gè)任務(wù)執(zhí)行完畢。
您可以同步調(diào)用線程的執(zhí)行,以及異步任務(wù)它啟動(dòng)通過(guò)調(diào)用 Wait 方法來(lái)等待要完成的一個(gè)或多個(gè)任務(wù)。
若要等待完成一項(xiàng)任務(wù),可以調(diào)用其 Task.Wait 方法。
調(diào)用 Wait 方法將一直阻塞調(diào)用線程直到單一類實(shí)例都已完成執(zhí)行。

5.4.4 接收任務(wù)的返回值

對(duì)于任務(wù)有返回值的情況,可使用Task泛型類,TResult定義了返回值的類型,以下代碼演示了調(diào)用返回int值的任務(wù)的方法。

public static void Main(){var t5 = new Task<int>(TaskWithResult, Tuple.Create<int, int>(1, 2));t5.Start();t5.Wait();Console.WriteLine("adder results: {0}", t5.Result);Console.ReadKey(); }public static int TaskWithResult(object o){Tuple<int, int> adder = (Tuple<int, int>)o;return adder.Item1 + adder.Item2;}

5.5 任務(wù)的層次結(jié)構(gòu)

如果在一個(gè)Task內(nèi)部創(chuàng)建了另一個(gè)任務(wù),這兩者間就存在父/子的層次結(jié)構(gòu),當(dāng)父任務(wù)被取消時(shí),子任務(wù)也會(huì)被取消。

如果不希望使用該層次結(jié)構(gòu),可在創(chuàng)建子任務(wù)時(shí)選擇TaskCreationOptions.DetachedFromParent。

6. BackgroundWorker控件

6.1 概述

C#提供了BackgroundWorker控件幫助用戶更簡(jiǎn)單、安全地實(shí)現(xiàn)多線程運(yùn)算。

該控件提供了DoWork, ProgressChanged 和 RunWorkerCompleted事件
為DoWork添加事件處理函數(shù),再調(diào)用RunWorkerAsync()方法,即可創(chuàng)建一個(gè)新的線程執(zhí)行DoWork任務(wù)

ProgressChanged和RunWorkerCompleted事件均在UI線程中執(zhí)行,添加相應(yīng)的處理函數(shù),即可完成任務(wù)線程與UI線程間的交互,可用于顯示任務(wù)的執(zhí)行狀態(tài)(完成百分比)、執(zhí)行結(jié)果等。

同時(shí),該控件還提供了CancleAsync()方法,以中斷線程的執(zhí)行
需注意的是,調(diào)用該方法后,只是將控件的CancellationPending屬性置True,用戶需在程序執(zhí)行過(guò)程中查詢?cè)搶傩砸耘卸ㄊ欠駪?yīng)中斷線程。

具體用法可參考MSDN:BackgroundWorker用法范例
可以看的出來(lái),BackgroundWorker組件提供了一種執(zhí)行異步操作(后臺(tái)線程)的同時(shí),并且還能妥妥的顯示操作進(jìn)度的解決方案。

6.2 屬性表

6.2.1 WorkerReportsProgress

bool類型,指示BackgroundWorker是否可以報(bào)告進(jìn)度更新。

  • True時(shí),可以成功調(diào)用ReportProgress方法
  • 否則將引發(fā)InvalidOperationException異常

用法:

private BackgroundWorker bgWorker = new BackgroundWorker(); bgWorker.WorkerReportsProgress = true;

6.2.2 WorkerSupportsCancellation

bool類型,指示BackgroundWorker是否支持異步取消操作

  • True時(shí),將可以成功調(diào)用CancelAsync方法

  • 否則將引發(fā)InvalidOperationException異
    用法:

bgWorker.WorkerSupportsCancellation = true;

6.2.3 CancellationPending

bool類型,指示應(yīng)用程序是否已請(qǐng)求取消后臺(tái)操作。
此屬性通常放在用戶執(zhí)行的異步操作內(nèi)部,用來(lái)判斷用戶是否取消執(zhí)行異步操作。
當(dāng)執(zhí)行BackgroundWorker.CancelAsync()方法時(shí),該屬性值將變?yōu)門rue。
用法:

//在DoWork中鍵入如下代碼for (int i = 0; i <= 100; i++){if (bgWorker.CancellationPending){e.Cancel = true;return;}else{bgWorker.ReportProgress(i,"Working");System.Threading.Thread.Sleep(10);}}

6.2.4 IsBusy

bool類型,指示BackgroundWorker是否正在執(zhí)行一個(gè)異步操作。
此屬性通常放在BackgroundWorker.RunWorkerAsync()方法之前,避免多次調(diào)用RunWorkerAsync()方法引發(fā)異常。
當(dāng)執(zhí)行BackgroundWorker.RunWorkerAsync()方法是,該屬性值將變?yōu)門rue。

//防止重復(fù)執(zhí)行異步操作引發(fā)錯(cuò)誤if (bgWorker.IsBusy)return;bgWorker.RunWorkerAsync();

6.3 方法表

6.3.1 RunWorkerAsync()

開始執(zhí)行一個(gè)后臺(tái)操作。

調(diào)用該方法后,將觸發(fā)BackgroundWorker.DoWork事件,并以異步的方式執(zhí)行DoWork事件中的代碼。
該方法還有一個(gè)帶參數(shù)的重載方法:RunWorkerAsync(Object)。
該方法允許傳遞一個(gè)Object類型的參數(shù)到后臺(tái)操作中,并且可以通過(guò)DoWork事件的DoWorkEventArgs.Argument屬性將該參數(shù)提取出來(lái)。

注:當(dāng)BackgroundWorker的IsBusy屬性為True時(shí),調(diào)用該方法將引發(fā)InvalidOperationException異常。

//在啟動(dòng)異步操作的地方鍵入代碼 bgWorker.RunWorkerAsync("hello");

6.3.2 ReportProgress(Int percentProgress)

報(bào)告操作進(jìn)度。

調(diào)用該方法后,將觸發(fā)BackgroundWorker. ProgressChanged事件。
另外,該方法包含了一個(gè)int類型的參數(shù)percentProgress,用來(lái)表示當(dāng)前異步操作所執(zhí)行的進(jìn)度百分比。

該方法還有一個(gè)重載方法:ReportProgress(Int percentProgress,?Object userState)。
允許傳遞一個(gè)Object類型的狀態(tài)對(duì)象到 ProgressChanged事件中
并且可以通過(guò)ProgressChanged事件的ProgressChangedEventArgs.UserState屬性取得參數(shù)值。

注:調(diào)用該方法之前需確保WorkerReportsProgress屬性值為True,否則將引發(fā)InvalidOperationException異常。

用法:

for (int i = 0; i <= 100; i++) {c//向ProgressChanged報(bào)告進(jìn)度bgWorker.ReportProgress(i,"Working");System.Threading.Thread.Sleep(10); }

6.3.3 CancelAsync()

請(qǐng)求取消當(dāng)前正在執(zhí)行的異步操作。

調(diào)用該方法將使BackgroundWorker.CancellationPending屬性設(shè)置為True。
但需要注意的是,并非每次調(diào)用CancelAsync()都能確保異步操作,CancelAsync()通常不適用于取消一個(gè)緊密執(zhí)行的操作,更適用于在循環(huán)體中執(zhí)行。
用法:

//在需要執(zhí)行取消操作的地方鍵入以下代碼 bgWorker.CancelAsync();

6.4 事件表

6.4.1 DoWork

用于承載異步操作。當(dāng)調(diào)用BackgroundWorker.RunWorkerAsync()時(shí)觸發(fā)。

需要注意的是:
由于DoWork事件內(nèi)部的代碼運(yùn)行在非UI線程之上,所以在DoWork事件內(nèi)部應(yīng)避免于用戶界面交互,
而于用戶界面交互的操作應(yīng)放置在ProgressChanged和RunWorkerCompleted事件中。

6.4.2 ProgressChanged

當(dāng)調(diào)用BackgroundWorker.ReportProgress(int percentProgress)方式時(shí)觸發(fā)該事件。
該事件的ProgressChangedEventArgs.ProgressPercentage屬性可以接收來(lái)自ReportProgress方法傳遞的percentProgress參數(shù)值,ProgressChangedEventArgs.UserState屬性可以接收來(lái)自ReportProgress方法傳遞的userState參數(shù)。

6.4.3 RunWorkerCompleted

異步操作完成或取消時(shí)執(zhí)行的操作,當(dāng)調(diào)用DoWork事件執(zhí)行完成時(shí)觸發(fā)。

該事件的RunWorkerCompletedEventArgs參數(shù)包含三個(gè)常用的屬性Error,Cancelled,Result。其中,Error表示在執(zhí)行異步操作期間發(fā)生的錯(cuò)誤;Cancelled用于判斷用戶是否取消了異步操作;Result屬性接收來(lái)自DoWork事件的DoWorkEventArgs參數(shù)的Result屬性值,可用于傳遞異步操作的執(zhí)行結(jié)果。

6.3 案例

using System; using System.ComponentModel; using System.Threading; using System.Windows.Forms;namespace bcworker {public partial class Form1 : Form{//后臺(tái)工作private BackgroundWorker bw = new BackgroundWorker();public Form1(){InitializeComponent();//后臺(tái)工作初始化bw.WorkerReportsProgress = true;//報(bào)告進(jìn)度bw.WorkerSupportsCancellation = true;//支持取消bw.DoWork += new DoWorkEventHandler(bgWorker_DoWork);//開始工作bw.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);//進(jìn)度改變事件bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);//進(jìn)度完成事件}private void btnStart_Click(object sender, EventArgs e){//后臺(tái)工作運(yùn)行中,避免重入if (bw.IsBusy) return;bw.RunWorkerAsync("參數(shù)");//觸發(fā)DoWork事件并異步執(zhí)行,IsBusy置為True}//后臺(tái)工作將異步執(zhí)行public void bgWorker_DoWork(object sender, DoWorkEventArgs e){//(string)e.Argument == "參數(shù)";for (int i = 0; i <= 100; i++){if (bw.CancellationPending){//用戶取消了工作e.Cancel = true;return;}else{bw.ReportProgress(i, "Working");//報(bào)告進(jìn)度,觸發(fā)ProgressChanged事件Thread.Sleep(10);//模擬工作}}}//進(jìn)度改變事件public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e){//(string)e.UserState=="Working"progressBar1.Value = e.ProgressPercentage;//取得進(jìn)度更新控件,不用Invoke了}//后臺(tái)工作執(zhí)行完畢,IsBusy置為Falsepublic void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e){//e.Error == null 是否發(fā)生錯(cuò)誤//e.Cancelled 完成是由于取消還是正常完成}private void btnCancel_Click(object sender, EventArgs e){if (bw.IsBusy) bw.CancelAsync();//設(shè)置CancellationPending屬性為True}} }

總結(jié)

以上是生活随笔為你收集整理的一文带你搞懂C#多线程的5种写法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

免费人做人爱www的视 | 免费久草视频 | 999在线精品 | 欧美伦理电影一区二区 | 日韩一区视频在线 | 69av久久| 99免费在线观看视频 | 国产96av | 丁香综合 | 黄色一级动作片 | 在线日韩av| 久久经典国产 | 青草草在线 | 国产精品久久久久久久久蜜臀 | 免费又黄又爽视频 | 国产精品完整版 | 精品国产中文字幕 | 中文字幕永久在线 | 国产视频亚洲视频 | 久久人人爽人人爽人人片av免费 | 国产v亚洲v| 一级黄色在线免费观看 | 丁香六月婷 | 综合久久一本 | 在线观影网站 | 国产剧情在线一区 | 欧美淫视频 | 免费91麻豆精品国产自产在线观看 | 99久热精品 | 免费日韩一区 | 超碰免费在线公开 | 人人爽人人爽人人爽人人爽 | 成人香蕉视频 | 亚洲成色777777在线观看影院 | 在线综合色 | 久久av中文字幕片 | 狠狠色丁香婷婷综合视频 | 欧美va天堂va视频va在线 | 久久久免费播放 | 美女黄频在线观看 | 亚洲三级毛片 | 国产一区二区免费在线观看 | 一区二区三区在线免费观看视频 | 日韩在线播放欧美字幕 | a精品视频 | 日韩在线一区二区免费 | 91精品久久久久久久久久久久久 | 日韩视频一区二区三区在线播放免费观看 | 久久久官网 | 久久免费成人网 | a√资源在线 | 最近中文字幕大全中文字幕免费 | 国产黄网站在线观看 | 日韩视频一区二区在线 | 国产最新91 | 亚洲国产精品第一区二区 | 天天搞夜夜骑 | 中文字幕丰满人伦在线 | 欧美精品免费一区二区 | 国产成人在线观看免费 | 97av视频 | 国产午夜精品一区二区三区嫩草 | 久久天堂精品视频 | 国产精品一区二区三区电影 | 99精品黄色片免费大全 | 亚洲区另类春色综合小说校园片 | 久久久久久电影 | 欧美精品乱码99久久影院 | 91少妇精拍在线播放 | 天天操夜夜操夜夜操 | 日韩欧美视频在线观看免费 | 欧美日韩成人一区 | 久久国产精品99久久久久 | 久久久久久久久久福利 | 午夜精品一区二区三区在线视频 | 久久99国产精品久久99 | 国产理论影院 | 中文字幕影片免费在线观看 | 亚洲精品乱码久久久久久蜜桃91 | 韩国av免费在线 | 国产精品久久久久久久久久不蜜月 | 精品国产aⅴ麻豆 | 久久国产精品久久久久 | 在线视频 区 | 国产成人精品亚洲精品 | 国产在线国偷精品产拍免费yy | 亚洲在线a | 黄p在线播放 | 97国产情侣爱久久免费观看 | 亚洲另类视频在线 | 99色在线| 日本在线观看一区二区三区 | 亚洲精品视频免费 | 午夜精品福利一区二区三区蜜桃 | 日本黄色大片儿 | 欧美91av| 麻豆传媒视频在线 | 国产一区高清在线观看 | 久久精品2| 777xxx欧美| 国产精品久久久一区二区三区网站 | 亚洲精品在线视频网站 | 久久国产精品一区二区三区 | 激情网在线视频 | 国产精品一区二区果冻传媒 | 在线久久| 日韩精品资源 | 亚洲一级电影 | 国产精品a久久久久 | 91精品免费 | 国产成人区| 亚洲男男gⅴgay双龙 | 亚洲免费一级电影 | 精品福利在线视频 | 国产精品久久久久久久av电影 | 日韩网站一区二区 | 国产丝袜网站 | 亚洲欧洲日韩在线观看 | 欧美精品一级视频 | 蜜臀av网址 | 日本久久久久久科技有限公司 | 91成人在线看| 国内揄拍国内精品 | 综合网久久 | 日本午夜免费福利视频 | 色综合天天视频在线观看 | 日韩av电影网站在线观看 | 999在线精品 | 欧美有色 | 成人九九视频 | 国产精品电影一区二区 | 中文字幕在线观看亚洲 | 在线观看片 | 香蕉久久久久久av成人 | 国产黄色成人 | 国产精品视频大全 | 日韩欧美综合 | 久久精品99国产 | 亚洲精品中文字幕在线观看 | 99综合影院在线 | 日本久久精 | 久久久久久久国产精品视频 | 在线播放日韩av | 国产精品 日韩精品 | 中文字幕在线观看第一区 | 欧美一级黄色片 | 日韩高清 一区 | 在线观看电影av | 国产高清专区 | 黄色午夜 | 日韩欧美在线国产 | 亚洲国产伊人 | 欧美性受极品xxxx喷水 | www国产亚洲精品久久麻豆 | 亚洲精品国产精品国自 | 国产精品四虎 | 国产精品2019| 国产中文字幕网 | www.狠狠色 | 亚洲精选99 | 国产高清不卡一区二区三区 | 九色精品免费永久在线 | 97成人在线观看 | 91精品国产自产在线观看 | 亚洲精品国产综合99久久夜夜嗨 | 丁香网五月天 | 特黄一级毛片 | 国产精品欧美一区二区 | 丁香五月亚洲综合在线 | 久久一区91 | 欧美乱码精品一区二区 | 国产在线观看你懂的 | 亚洲人xxx| 久久好看免费视频 | 中文字幕黄色网 | 九九九视频在线 | 人人视频网站 | 成人午夜免费福利 | 亚洲在线 | 国产精品免费看 | 国产99久久精品一区二区永久免费 | 天天摸天天操天天舔 | 中文字幕亚洲欧美 | 中文字幕色婷婷在线视频 | 国产精品h在线观看 | 激情文学丁香 | 亚洲精品成人av在线 | 久久一区二区三区国产精品 | 国产精品一区二区中文字幕 | 日本三级中文字幕在线观看 | 一区二区三区中文字幕在线 | 国产一二区免费视频 | 国产在线v | 免费看色网站 | 久久新 | 日韩欧美高清一区二区 | 国产成人av综合色 | 国内免费久久久久久久久久久 | 天天爽夜夜爽人人爽曰av | 91精品在线视频 | 国产免费亚洲高清 | 热久久99这里有精品 | www.黄色在线 | 亚洲一区二区麻豆 | 日韩中文字幕免费 | 中文字幕av网站 | 91色视频 | 国产精品v欧美精品v日韩 | 天天操夜夜操夜夜操 | 久久成人久久 | 天天色天天操综合网 | 久久人人爽人人片av | 中文字幕免费观看全部电影 | 久久国语露脸国产精品电影 | 国产品久精国精产拍 | 日韩区视频| 日本精品一区二区三区在线观看 | 91av成人| 在线国产一区二区三区 | 99国产情侣在线播放 | 亚洲高清色综合 | 亚洲精选视频在线 | 97在线观看免费观看 | 久久国产美女 | 狠狠狠操 | 午夜美女福利 | www色网站 | 成人久久18免费网站图片 | 色综合久久久久综合99 | 亚洲粉嫩av | 伊人黄 | 97视频在线观看成人 | 在线视频 精品 | 亚洲精品一区二区三区四区高清 | 999视频精品 | 亚洲综合在线发布 | 99久久精品免费看国产一区二区三区 | 国产亚洲视频中文字幕视频 | 午夜视频在线观看一区二区三区 | 四虎影视国产精品免费久久 | 久久国产精品免费视频 | 天天干天天干天天射 | 久久久久久久久久久影院 | 日韩免费在线观看视频 | 国产丝袜 | 麻豆影视在线免费观看 | 人人爽人人av | 国产精品视频在线观看 | 日本在线观看一区二区 | 欧美 日韩 国产 成人 在线 | 久久成人免费电影 | 91高清不卡| 国产理论一区二区三区 | 亚洲在线免费视频 | 操综合| www.av在线.com | ww视频在线观看 | 中文字幕亚洲不卡 | 在线观看的av | 91福利视频免费 | 麻豆一区在线观看 | 99精品电影 | 日韩精品免费在线视频 | 亚洲1级片 | 日韩一二区在线观看 | 天天干天天天天 | 国产理论免费 | 免费碰碰 | 乱子伦av| 中文字幕在线字幕中文 | 日韩一二三在线 | 免费黄av | 亚洲区视频在线观看 | 伊人手机在线 | 日韩毛片久久久 | 久久久久久久国产精品视频 | av在线一级 | 日日狠狠| 亚洲视频六区 | 国内丰满少妇猛烈精品播 | 999久久国产精品免费观看网站 | 992tv又爽又黄的免费视频 | 麻豆一精品传二传媒短视频 | 99操视频 | 国产一区网 | 中文在线8新资源库 | 久久九九久久九九 | 色网免费观看 | 欧美日韩国产高清视频 | 久草 | 精品麻豆| 成人综合日日夜夜 | 日韩高清免费电影 | 99精品视频免费观看 | 99精品视频99 | 久久综合狠狠综合 | 成人黄色电影在线播放 | 日韩特黄一级欧美毛片特黄 | 国产亚洲一区二区在线观看 | 中文字幕在线观看一区二区三区 | 98精品国产自产在线观看 | 美女网站在线 | 国产精品免费在线观看视频 | 久久精品毛片基地 | 婷婷亚洲综合 | 成年人看片 | 五月婷婷久久综合 | 国产精品成人一区二区 | 激情电影在线观看 | 99福利影院 | 精品a在线 | 免费三级骚 | 美女天天操 | 日韩av在线网站 | 超碰在线97免费 | 精品一区二区在线免费观看 | 伊人婷婷激情 | 在线一二三区 | 免费色视频 | 91九色性视频 | 91超碰在线播放 | 肉色欧美久久久久久久免费看 | 网址你懂的在线观看 | 久草视频免费观 | 97超碰人人模人人人爽人人爱 | 91九色精品女同系列 | 久久久影片 | 免费看黄20分钟 | 狠色狠色综合久久 | 天天操网站 | 日韩在线高清视频 | 日韩色在线 | 奇米影视8888在线观看大全免费 | 一区二区三区播放 | 夜色成人网| 亚洲成人国产 | 麻豆视频免费播放 | 国产精品1000 | 欧美日韩综合在线 | 精品久久美女 | 国产精品6999成人免费视频 | 99久久久成人国产精品 | 欧美精品网站 | 91人人射| 亚洲精品美女在线观看播放 | 四虎影视4hu4虎成人 | avcom在线| 色就是色综合 | 日韩资源在线播放 | 99色免费| 国产视频日韩视频欧美视频 | 狂野欧美激情性xxxx | 午夜国产一区 | 成人影视免费 | 91av在线视频免费观看 | 日韩高清二区 | 不卡的av电影 | 国产成人一区二区三区在线观看 | 黄色视屏在线免费观看 | 国产一级免费视频 | 亚洲国产精品500在线观看 | 高清有码中文字幕 | 欧美日韩一区二区免费在线观看 | 日韩高清精品免费观看 | 久久久久久国产精品 | 在线免费黄色毛片 | 色婷婷在线视频 | 911国产在线观看 | 黄色在线观看www | 一级片黄色片网站 | 欧美日韩国产一区二 | 婷婷丁香色 | 成人亚洲综合 | 五月的婷婷 | 久久久国产影院 | 啪啪免费试看 | 久久激情日本aⅴ | av在线电影播放 | 在线天堂中文www视软件 | 91人人射 | 久久精品一区二区三 | 黄色在线免费观看网址 | 久久成人毛片 | 91福利视频网站 | 亚洲区另类春色综合小说校园片 | 欧美-第1页-屁屁影院 | 日韩欧美国产精品 | 在线观看网站你懂的 | 91在线视频免费播放 | 色丁香婷婷 | 久久大香线蕉app | 国产第一二区 | 91麻豆网| 成人影视免费 | 欧美贵妇性狂欢 | 欧美久久久久 | 黄色中文字幕在线 | 久久在线观看视频 | 亚洲精品字幕 | 二区三区毛片 | 中文字幕一区二区三区在线播放 | 日韩高清精品一区二区 | 久久综合影视 | 免费国产ww | 国产男女无遮挡猛进猛出在线观看 | 日韩一区正在播放 | 91中文字幕在线观看 | 天天玩天天干 | 精品中文字幕视频 | 亚洲久在线 | 97网站| 在线播放91 | 欧美日韩精品电影 | 精品国精品自拍自在线 | 色av男人的天堂免费在线 | 97国产小视频| 91在线欧美| 成年人电影免费在线观看 | 久久免费精彩视频 | 亚洲精品视频中文字幕 | 国产丝袜 | 国产黄色精品在线观看 | 超碰av在线播放 | 久久精品人 | 在线观看91视频 | 久视频在线播放 | 日韩欧美视频免费在线观看 | 国产精品免费麻豆入口 | 日韩精品第1页 | 精品国产亚洲在线 | 亚洲网站在线 | 日韩区欠美精品av视频 | 久久99久久99精品免观看粉嫩 | 亚洲深夜影院 | 久草视频精品 | 久久久久女教师免费一区 | 久日精品 | 国产永久免费高清在线观看视频 | 国产99久久精品一区二区300 | 国产精品九九九九九 | 亚洲欧美怡红院 | 成 人 黄 色视频免费播放 | 四虎影视4hu4虎成人 | 在线最新av | 久草网视频 | 精品免费一区 | 日韩av美女 | 97夜夜澡人人双人人人喊 | 黄色一区三区 | 91一区在线观看 | 天天色天天搞 | 婷婷综合亚洲 | 日韩精品中文字幕av | 欧美精品久久久久久久久久 | 日韩手机在线 | 国产精品亚洲人在线观看 | 免费日韩 | 91插插插网站 | 久久综合给合久久狠狠色 | 国产精品门事件 | 久久久午夜电影 | 免费成人结看片 | 国产成人在线综合 | 国产99久久久精品 | 国产在线成人 | 国产精品一区二区三区久久久 | 中文不卡视频 | 在线观看黄色国产 | 欧美激情一区不卡 | 国产一区在线观看视频 | 国产精品手机看片 | 久久久精品久久日韩一区综合 | 久久视频6 | 精品国产成人av在线免 | 网站免费黄色 | 亚洲a网 | 欧美天堂久久 | 精品国产免费人成在线观看 | 国产精品嫩草影视久久久 | 狠狠操操网| 亚洲精品97 | 国产中文视频 | 亚洲成a人片77777kkkk1在线观看 | 成x99人av在线www | 久久久久久久久久久免费av | 91精品国产电影 | 日韩午夜三级 | 91精品综合在线观看 | 久久伊99综合婷婷久久伊 | 国产一级片一区二区三区 | 国产专区一 | 久久精品爱爱视频 | 国产精品乱码在线 | 99热在线观看免费 | 亚洲资源在线网 | 国产免费看 | 97精产国品一二三产区在线 | 五月综合色 | 欧美日韩伦理在线 | 成年人视频在线免费 | 国产精品夜夜夜一区二区三区尤 | 1区2区视频 | 日本精品小视频 | 国产在线观看免费av | 国产精品久久久久国产a级 激情综合中文娱乐网 | 性日韩欧美在线视频 | 成人黄视频| 国产欧美在线一区二区三区 | 久日精品 | 亚洲va男人天堂 | 久久 在线 | 婷婷丁香久久五月婷婷 | 亚洲国产福利视频 | 亚洲日本激情 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美性网站 | 91最新在线观看 | 中文字幕资源网 国产 | 97超碰福利久久精品 | 亚洲成aⅴ人在线观看 | 久爱综合| 国产91粉嫩白浆在线观看 | 狠狠色婷婷丁香六月 | 91亚洲精品国偷拍自产在线观看 | 视频一区二区在线观看 | 国产精品一区二区62 | 欧美激情视频在线观看免费 | 新版资源中文在线观看 | 手机在线观看国产精品 | 九九热久久免费视频 | 国产 视频 高清 免费 | 国产精品久久久久久婷婷天堂 | 国产精品福利一区 | 日日草天天草 | 狠狠色香婷婷久久亚洲精品 | 色婷婷色 | av黄色影院 | 经典三级一区 | 亚洲干视频在线观看 | 久久精品国产精品亚洲 | 国产精品av一区二区 | 日韩在线高清 | 亚洲人在线 | 国产午夜三级一二三区 | 国产亚洲欧美日韩高清 | 日韩欧美在线一区 | 亚洲人成在线电影 | 天天做日日做天天爽视频免费 | 亚洲资源视频 | 国内丰满少妇猛烈精品播 | 在线观看成人一级片 | 狠狠色婷婷丁香六月 | 久久黄色免费观看 | 久久www免费视频 | 久久激五月天综合精品 | 免费黄在线观看 | 五月婷婷综合激情网 | 亚洲免费精品视频 | 中文字幕视频免费观看 | 在线观看a视频 | 中文字幕高清 | 精品免费一区二区三区 | 国产精品一区二区av | 国产日韩视频在线 | 国产视频久久 | 久久精品国产免费观看 | 天天操夜夜逼 | 精品亚洲网 | 97自拍超碰 | 有码中文字幕在线观看 | 欧美日韩高清在线一区 | 超碰97久久| 精品免费一区二区三区 | 免费在线观看国产黄 | 欧美国产一区在线 | 最近中文字幕第一页 | 色欧美视频 | 国产拍在线 | 在线观看精品黄av片免费 | 91伊人影院| www.狠狠干| 久久夜av| 91成人在线免费观看 | 精品国产伦一区二区三区观看体验 | 国产电影黄色av | 久久精品看片 | 国产亚洲精品久久久久久大师 | 丁香六月欧美 | 中文字幕av免费观看 | 一区二区三区 亚洲 | 久久999久久 | 欧美日本一二三 | 一区 二区电影免费在线观看 | 六月激情丁香 | 成年人在线观看 | 成人在线免费看 | 精品视频99 | 色五月成人 | 成年人天堂com | 亚洲免费a | 国产尤物视频在线 | 99久热在线精品视频成人一区 | 中文字幕在线观看一区二区 | 又黄又爽又无遮挡免费的网站 | 国产福利中文字幕 | 天天躁日日躁狠狠躁av麻豆 | 精品国产精品久久 | 亚洲影院天堂 | 久久a国产 | 久久综合久久综合这里只有精品 | 激情久久久久久久久久久久久久久久 | 天天操天天操天天干 | av解说在线观看 | 永久免费精品视频网站 | 免费福利片2019潦草影视午夜 | 亚洲成人黄 | 中文字幕在线观看2018 | 国产精品久久亚洲 | 成 人 黄 色 视频播放1 | 亚洲精色| 日韩精品不卡在线观看 | 1区2区3区在线观看 三级动图 | 国产成人久久av免费高清密臂 | 久久99热这里只有精品 | 激情五月看片 | 久久久久久欧美二区电影网 | av电影在线免费观看 | 91精品在线免费观看 | 深夜视频久久 | 毛片1000部免费看 | 色综合欧洲 | 国产精品激情偷乱一区二区∴ | 在线观看国产区 | 国产精品久久久免费 | 中文字幕在线播放视频 | 日韩一区正在播放 | 女人魂免费观看 | www欧美日韩 | 五月天久久久 | 国产一级二级av | 欧美日韩在线第一页 | 99在线精品视频 | 伊人久久影视 | 天天操天天干天天插 | 手机av电影在线 | 久久中文精品视频 | 欧美日韩一区二区三区视频 | 国产一级视频在线观看 | 久久国产三级 | 视频在线99| 在线 你懂| 九九久 | 免费成人在线网站 | 三级av黄色| 免费看黄在线看 | 欧美日韩一级久久久久久免费看 | 国产精品黄色在线观看 | 人人玩人人添人人澡超碰 | 亚洲精品xx | 麻豆传媒电影在线观看 | 在线视频欧美精品 | 免费瑟瑟网站 | 亚洲国产精品va在线看黑人动漫 | 久久夜色精品国产欧美一区麻豆 | 成年人看片 | 西西44人体做爰大胆视频 | 久久精品中文 | 国产高清视频在线播放 | a视频免费| 久久爱影视i | 国产视频1区2区3区 久久夜视频 | 久章草在线 | 亚洲精品在线观看不卡 | 国产精品 久久 | 国产视频精品免费 | 国产黄色观看 | 热久久这里只有精品 | 又黄又爽又刺激视频 | 麻豆免费视频网站 | 国产综合91 | 波多野结衣电影一区二区 | 国产黑丝一区二区 | 欧美一级片在线观看视频 | 久久超级碰 | 九九九九免费视频 | 黄色av成人在线观看 | 99精品国产视频 | 久久午夜国产精品 | 日韩综合视频在线观看 | 久草观看| 91九色视频在线播放 | 91人人干 | 最近最新中文字幕视频 | 狠狠天天 | 欧美了一区在线观看 | 日日干天天 | 久草在线免费电影 | 色99网| 91麻豆精品国产91久久久无限制版 | 婷婷六月综合网 | 西西人体4444www高清视频 | 丝袜一区在线 | 99精品欧美一区二区蜜桃免费 | 嫩嫩影院理论片 | 久久久久久久久久久久久国产精品 | 少妇性xxx | 欧美精品中文字幕亚洲专区 | 粉嫩av一区二区三区免费 | 亚洲美女视频在线观看 | 久久久久久久久免费 | 国产精品91一区 | 亚洲精品国产拍在线 | 日韩高清观看 | 97品白浆高清久久久久久 | 亚洲 欧洲 国产 精品 | 成人免费在线电影 | 激情欧美一区二区三区 | 亚洲精品国精品久久99热一 | 91精彩视频 | 亚洲六月丁香色婷婷综合久久 | 欧美日韩不卡一区二区 | 日日干av| 天天操狠狠操夜夜操 | 播五月综合 | 日韩精品免费一区 | 日本大尺码专区mv | 69av网| 国产精品久久电影观看 | 中文字幕一区二区三区久久蜜桃 | 婷婷久久一区二区三区 | 麻豆一级视频 | 国产精品九九九 | 伊人热| 永久免费精品视频网站 | 91综合久久一区二区 | 国产一区二区三区午夜 | 久久精品久久精品久久39 | 天天射一射| 日韩av电影手机在线观看 | 国产精品一区二区久久久 | 国产区在线看 | 国产精品日韩在线播放 | 久久色中文字幕 | 福利视频一二区 | av网址在线播放 | av日韩在线网站 | 精品国产123 | 人人澡人人澡人人 | 色插综合| 久久精品人人做人人综合老师 | 国产在线观看免费观看 | 久久女同性恋中文字幕 | 久久久国产影院 | 日本中文字幕电影在线免费观看 | 精品自拍网 | 免费成人在线观看视频 | 天天干天天干天天干天天干天天干天天干 | 精品久久亚洲 | 中文字幕一区二区三区在线播放 | 亚洲精品综合久久 | 国产亚洲精品久久久久秋 | 字幕网资源站中文字幕 | 久久久久久毛片精品免费不卡 | 久久精品99久久 | 黄色成人av| 久久久久免费精品国产 | 欧美午夜性生活 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 在线观看av网站 | 91麻豆精品国产91久久久久 | 国产福利av | 欧美精品久久久久久久 | 香蕉久久久久久av成人 | 国产在线播放一区二区 | 日本精品xxxx| 久久免费在线 | 日韩aⅴ视频 | 日本黄色片一区二区 | 国产天天爽 | 亚洲 欧洲 国产 日本 综合 | 久久丁香网 | 天天综合天天做天天综合 | 天天天天色综合 | 国产99久久久国产精品免费二区 | 亚洲成成品网站 | 久99久中文字幕在线 | 六月婷婷网 | 天天操天天能 | 丁香六月国产 | 美女黄频网站 | 亚洲电影av在线 | 日韩视频二区 | 亚洲 欧美 另类人妖 | 狠狠色伊人亚洲综合成人 | 亚洲一区二区视频在线播放 | 欧洲一区精品 | 日韩欧美成人网 | 91九色精品女同系列 | 久99久精品 | av片子在线观看 | 欧美一区二区三区不卡 | 9在线观看免费高清完整版 玖玖爱免费视频 | www.成人久久 | 日韩黄色免费电影 | 波多野结衣一区三区 | 一级片视频在线 | 欧美 亚洲 另类 激情 另类 | 亚洲年轻女教师毛茸茸 | 成人在线播放免费观看 | 日韩精品高清不卡 | 一二区精品| 日本性高潮视频 | 超碰大片 | 久久视频这里有久久精品视频11 | 国产九九在线 | 日韩影视在线 | 制服丝袜天堂 | 欧美精品久久人人躁人人爽 | 中文字幕第 | 国产韩国日本高清视频 | 日韩理论影院 | 人人射人人澡 | 亚洲va在线va天堂va偷拍 | 激情欧美一区二区三区 | 色视频网站在线 | 91在线超碰| 91欧美视频网站 | 手机色在线 | 一区二区视频在线免费观看 | 91精品啪啪 | 国产日韩欧美综合在线 | 日韩欧美电影网 | 精品天堂av | 欧美成人在线网站 | 成人av播放 | 欧美色操| 国产精品日韩久久久久 | 欧美综合在线视频 | 国产韩国日本高清视频 | 日韩国产精品久久久久久亚洲 | 中文字幕在线一二 | 免费午夜在线视频 | 久久国产精品99国产精 | 在线观看岛国av | 国产亚洲久久 | 中文字幕在线观看一区二区 | 九九精品视频在线观看 | 国产一区二区不卡在线 | 很黄很色很污的网站 | 亚洲视频综合在线 | 一区二区三区不卡在线 | 久久 地址| 国产精品综合在线 | 特级毛片在线 | 三级av片| 99色| 中国一级片视频 | 国产日韩中文字幕在线 | 美女国内精品自产拍在线播放 | 国产一级高清视频 | 久久精品美女视频 | 日日干夜夜干 | 99爱在线观看 | av天天澡天天爽天天av | 亚洲专区在线 | 91精品国产99久久久久久红楼 | 免费合欢视频成人app | 麻豆视频免费网站 | 国产成人精品一区二区三区免费 | 中文字幕日韩av | 97超碰资源 | 亚洲三级黄色 | 免费看三级网站 | 久久xxxx | 色 免费观看 | 亚洲成av人片在线观看www | 米奇狠狠狠888 | 婷婷5月色 | 黄a在线观看 | 婷婷综合视频 | 中文字幕高清视频 | 91在线免费视频观看 | 九色精品免费永久在线 | 日本xxxxav| 免费看的黄色小视频 | 在线免费看黄网站 | 五月婷婷久久综合 | 韩国av免费看| 人人澡人人爱 | 97超碰人人澡 | 久热av| 国产高清av免费在线观看 | 9热精品 | 玖草在线观看 | 91在线免费播放 | 精品国产一区二区三区四 | 亚洲影院色 | 网站在线观看日韩 | 日本黄色免费在线观看 | 日韩av二区| 午夜精品一区二区三区在线 | 少妇bbb好爽 | 天天艹| 91精品国产91热久久久做人人 | 深夜福利视频在线观看 | 婷婷在线视频 | 日韩视频一区二区三区在线播放免费观看 | www.五月婷婷.com | 婷婷伊人五月天 | 婷婷丁香九月 | 黄色一级大片在线免费看国产一 | 色悠悠久久综合 | 五月天.com | 国产不卡一二三区 | 国产精品1024 | 婷婷在线网站 | 国产精品www | 97超碰超碰久久福利超碰 | 日韩理论片| 免费视频一二三区 | 精品久久99 | 久久夜视频 | 日韩免费福利 | 久草在线资源视频 | 中文字幕av在线播放 | www夜夜| 日韩一区二区三区在线观看 | 婷婷丁香五 | 久草在线最新视频 | 97人人模人人爽人人喊网 | 黄色日批网站 | 一区二区三区电影在线播 | 国产视频在线一区二区 | 午夜精品导航 | 美女黄视频免费看 | 91片黄在线观 | 国产一区二区视频在线 | 日本久久久亚洲精品 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久免费视频一区 | 丁香花中文在线免费观看 | 国产一区网址 | 人人干免费 | 久久免费一级片 | 日韩欧美视频二区 | 超碰在97| 国产精品久久久久久久久久99 | 国产精品福利午夜在线观看 | 在线成人中文字幕 | 天天色天天干天天色 | 日韩免费不卡av | 久久成人国产精品 | 久久久www成人免费毛片麻豆 | 日日夜夜精品网站 | 亚洲精品www. | 亚洲综合色视频 | 蜜臀av网址 | 日韩天天操| 成人免费共享视频 | 婷婷久久久 | 天天操天天操 | 国产精品一区二区在线 | 91福利影院在线观看 | 91丨九色丨蝌蚪丨老版 | 亚洲理论电影网 | 91日韩在线 | 日韩动漫免费观看高清完整版在线观看 | 国产精品99久久久久久有的能看 | 久久久免费毛片 | 99国产成+人+综合+亚洲 欧美 | 日日操操操 | 亚洲成人黄色在线观看 | 综合网伊人| 国产高清视频免费在线观看 | 国产成人精品av在线 | 天天综合在线观看 | 99久久这里有精品 | 午夜久久成人 | 日韩av在线小说 | 久久久麻豆精品一区二区 | 成人久久久电影 | 天天天操操操 | www最近高清中文国语在线观看 | 免费看片网址 | 国产99自拍 | 欧美日韩国产一区 | 狠狠色噜噜狠狠狠狠2021天天 | www.午夜色.com | 久久不见久久见免费影院 | 久久成人精品 | 国产一区二区高清视频 | 在线亚洲观看 | 日韩在线字幕 | 亚洲天天在线 | 久久久www成人免费精品 | 国产精品综合av一区二区国产馆 | 日韩专区在线 | 国产精品久久久久久久久搜平片 |