亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#使用多線程的幾種方式示例詳解

2020-01-24 02:49:47
字體:
來源:轉載
供稿:網友

(1)不需要傳遞參數,也不需要返回參數

ThreadStart是一個委托,這個委托的定義為void ThreadStart(),沒有參數與返回值。

復制代碼 代碼如下:

class Program

{

static void Main(string[] args)

{

for (int i = 0; i < 30; i++)

{

ThreadStart threadStart = new ThreadStart(Calculate);

Thread thread = new Thread(threadStart);

thread.Start();

}

Thread.Sleep(2000);

Console.Read();

}

public static void Calculate()

{

DateTime time = DateTime.Now;//得到當前時間

Random ra = new Random();//隨機數對象

Thread.Sleep(ra.Next(10,100));//隨機休眠一段時間

Console.WriteLine(time.Minute + ":" + time.Millisecond);

}

}

(2)需要傳遞單個參數

ParameterThreadStart委托定義為void ParameterizedThreadStart(object state),有一個參數但是沒有返回值。

復制代碼 代碼如下:

class Program

{

static void Main(string[] args)

{

for (int i = 0; i < 30; i++)

{

ParameterizedThreadStart tStart = new ParameterizedThreadStart(Calculate);

Thread thread = new Thread(tStart);

thread.Start(i*10+10);//傳遞參數

}

Thread.Sleep(2000);

Console.Read();

}

public static void Calculate(object arg)

{

Random ra = new Random();//隨機數對象

Thread.Sleep(ra.Next(10, 100));//隨機休眠一段時間

Console.WriteLine(arg);

}

}

(3)使用專門的線程類(常用)

使用線程類可以有多個參數與多個返回值,十分靈活!

復制代碼 代碼如下:

class Program

{

static void Main(string[] args)

{

MyThread mt = new MyThread(100);

ThreadStart threadStart = new ThreadStart(mt.Calculate);

Thread thread = new Thread(threadStart);

thread.Start();

   //等待線程結束

while (thread.ThreadState != ThreadState.Stopped)

{

Thread.Sleep(10);

}

Console.WriteLine(mt.Result);//打印返回值

Console.Read();

}

}

public class MyThread//線程類

{

public int Parame { set; get; }//參數

public int Result { set; get; }//返回值

//構造函數

public MyThread(int parame)

{

this.Parame = parame;

}

//線程執行方法

public void Calculate()

{

Random ra = new Random();//隨機數對象

Thread.Sleep(ra.Next(10, 100));//隨機休眠一段時間

Console.WriteLine(this.Parame);

this.Result = this.Parame * ra.Next(10, 100);

}

}

(4)使用匿名方法(常用)

使用匿名方法啟動線程可以有多個參數和返回值,而且使用非常方便!

復制代碼 代碼如下:

class Program

{

static void Main(string[] args)

{

int Parame = 100;//當做參數

int Result = 0;//當做返回值

//匿名方法

ThreadStart threadStart = new ThreadStart(delegate()

{

Random ra = new Random();//隨機數對象

Thread.Sleep(ra.Next(10, 100));//隨機休眠一段時間

Console.WriteLine(Parame);//輸出參數

Result = Parame * ra.Next(10, 100);//計算返回值

});

Thread thread = new Thread(threadStart);

thread.Start();//多線程啟動匿名方法

//等待線程結束

while (thread.ThreadState != ThreadState.Stopped)

{

Thread.Sleep(10);

}

Console.WriteLine(Result);//打印返回值

Console.Read();

}
}

(5)使用委托開啟多線程(多線程深入)

1、用委托(Delegate)的BeginInvoke和EndInvoke方法操作線程

BeginInvoke方法可以使用線程異步地執行委托所指向的方法。然后通過EndInvoke方法獲得方法的返回值(EndInvoke方法的返回值就是被調用方法的返回值),或是確定方法已經被成功調用。

復制代碼 代碼如下:

class Program

{

private delegate int NewTaskDelegate(int ms);

private static int newTask(int ms)

{

Console.WriteLine("任務開始");

Thread.Sleep(ms);

Random random = new Random();

int n = random.Next(10000);

Console.WriteLine("任務完成");

return n;

}

static void Main(string[] args)

{

NewTaskDelegate task = newTask;

IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);

//EndInvoke方法將被阻塞2秒

int result = task.EndInvoke(asyncResult);

Console.WriteLine(result);

Console.Read();

}

}

2、使用IAsyncResult.IsCompleted屬性來判斷異步調用是否完成

復制代碼 代碼如下:

class Program

{

private delegate int NewTaskDelegate(int ms);

private static int newTask(int ms)

{

Console.WriteLine("任務開始");

Thread.Sleep(ms);

Random random = new Random();

int n = random.Next(10000);

Console.WriteLine("任務完成");

return n;

}

static void Main(string[] args)

{

NewTaskDelegate task = newTask;

IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);

//等待異步執行完成

while (!asyncResult.IsCompleted)

{

Console.Write("*");

Thread.Sleep(100);

}

// 由于異步調用已經完成,因此, EndInvoke會立刻返回結果

int result = task.EndInvoke(asyncResult);

Console.WriteLine(result);

Console.Read();

}

}

3、使用WaitOne方法等待異步方法執行完成

WaitOne的第一個參數表示要等待的毫秒數,在指定時間之內,WaitOne方法將一直等待,直到異步調用完成,并發出通知,WaitOne方法才返回true。當等待指定時間之后,異步調用仍未完成,WaitOne方法返回false,如果指定時間為0,表示不等待,如果為-1,表示永遠等待,直到異步調用完成。

復制代碼 代碼如下:

class Program

{

private delegate int NewTaskDelegate(int ms);

private static int newTask(int ms)

{

Console.WriteLine("任務開始");

Thread.Sleep(ms);

Random random = new Random();

int n = random.Next(10000);

Console.WriteLine("任務完成");

return n;

}

static void Main(string[] args)

{

NewTaskDelegate task = newTask;

IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);

//等待異步執行完成

while (!asyncResult.AsyncWaitHandle.WaitOne(100, false))

{

Console.Write("*");

}

int result = task.EndInvoke(asyncResult);

Console.WriteLine(result);

Console.Read();

}

}

4、使用回調方式返回結果

要注意的是“my.BeginInvoke(3,300, MethodCompleted, my)”,BeginInvoke方法的參數傳遞方式:

前面一部分(3,300)是其委托本身的參數。

倒數第二個參數(MethodCompleted)是回調方法委托類型,他是回調方法的委托,此委托沒有返回值,有一個IAsyncResult類型的參數,當method方法執行完后,系統會自動調用MethodCompleted方法。

最后一個參數(my)需要向MethodCompleted方法中傳遞一些值,一般可以傳遞被調用方法的委托,這個值可以使用IAsyncResult.AsyncState屬性獲得。

復制代碼 代碼如下:

class Program

{

private delegate int MyMethod(int second, int millisecond);

//線程執行方法

private static int method(int second, int millisecond)

{

Console.WriteLine("線程休眠" + (second * 1000 + millisecond) + "毫秒");

Thread.Sleep(second * 1000 + millisecond);

Random random = new Random();

return random.Next(10000);

}

//回調方法

private static void MethodCompleted(IAsyncResult asyncResult)

{

if (asyncResult == null || asyncResult.AsyncState == null)

{

Console.WriteLine("回調失?。。。?);

return;

}

int result = (asyncResult.AsyncState as MyMethod).EndInvoke(asyncResult);

Console.WriteLine("任務完成,結果:" + result);

}

static void Main(string[] args)

{

MyMethod my = method;

IAsyncResult asyncResult = my.BeginInvoke(3,300, MethodCompleted, my);

Console.WriteLine("任務開始");

Console.Read();

}

}

5、其他組件的BeginXXX和EndXXX方法

在其他的.net組件中也有類似BeginInvoke和EndInvoke的方法,如System.Net.HttpWebRequest類的BeginGetResponse和EndGetResponse方法。其使用方法類似于委托類型的BeginInvoke和EndInvoke方法,例如:

復制代碼 代碼如下:

class Program

{

//回調函數

private static void requestCompleted(IAsyncResult asyncResult)

{

if (asyncResult == null || asyncResult.AsyncState==null)

{

Console.WriteLine("回調失敗");

return;

}

HttpWebRequest hwr = asyncResult.AsyncState as HttpWebRequest;

HttpWebResponse response = (HttpWebResponse)hwr.EndGetResponse(asyncResult);

StreamReader sr = new StreamReader(response.GetResponseStream());

string str = sr.ReadToEnd();

Console.WriteLine("返回流長度:"+str.Length);

}

static void Main(string[] args)

{

HttpWebRequest request =

(HttpWebRequest)WebRequest.Create("http://www.baidu.com");

//異步請求

IAsyncResult asyncResult = request.BeginGetResponse(requestCompleted, request);

Console.WriteLine("任務開始");

Console.Read();

}

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色哟哟网站入口亚洲精品| 97在线视频一区| 欧美成人性色生活仑片| 亚洲国产毛片完整版| 最近中文字幕日韩精品| 日韩精品中文字幕在线| 国产视频亚洲视频| 日韩免费观看在线观看| 日韩激情在线视频| 在线日韩第一页| 国产精品揄拍一区二区| 成人a在线视频| 日韩在线国产精品| 国产精品99久久久久久久久久久久| 美女性感视频久久久| 色婷婷av一区二区三区在线观看| 日韩黄色在线免费观看| 在线亚洲男人天堂| 欧美精品18videosex性欧美| 97免费视频在线播放| 美女精品视频一区| 亚洲精品91美女久久久久久久| 黑人巨大精品欧美一区二区免费| 久久精品影视伊人网| 久久久噜久噜久久综合| 国产精品美乳一区二区免费| 国产精品第2页| 国产精品中文在线| 欧美精品性视频| 国产丝袜一区二区三区免费视频| 欧美在线视频一二三| 国产成人一区二区三区| 亚洲奶大毛多的老太婆| 久久精品中文字幕电影| 成人午夜两性视频| 亚洲精品福利免费在线观看| 亚洲图片欧洲图片av| 日韩视频在线一区| 亚洲色图美腿丝袜| 91久久精品美女高潮| 国产一区二区三区在线免费观看| 色爱精品视频一区| 亚洲自拍偷拍色片视频| 久久久久久噜噜噜久久久精品| 国产不卡在线观看| 色99之美女主播在线视频| 91成品人片a无限观看| 日韩在线视频国产| 日韩电影在线观看永久视频免费网站| 成人国产在线激情| 2019中文字幕在线免费观看| 欧美激情免费视频| 91免费人成网站在线观看18| 亚洲视频777| 亚洲情综合五月天| 亚洲欧美成人一区二区在线电影| 国产91av在线| 91免费国产视频| 亚洲人成网站色ww在线| 亚洲第一免费播放区| 国产一区二区三区三区在线观看| 国产精品av免费在线观看| 91精品国产综合久久香蕉的用户体验| 欧美日韩加勒比精品一区| 精品国产1区2区| 久久久免费av| 亚洲高清一区二| 亚洲一区二区久久久久久久| 亚洲天堂免费观看| 亚洲欧美精品suv| 亚洲自拍偷拍福利| 欧美成在线观看| 69av视频在线播放| 超碰精品一区二区三区乱码| 久久久久久久久久久av| 欧美在线激情视频| 日韩欧美成人精品| 亚洲欧美一区二区三区四区| 国产ts人妖一区二区三区| 久久精品这里热有精品| 91久久中文字幕| 国产精品久久久久久影视| 欧美乱大交xxxxx另类电影| 欧美美女15p| 成人黄色在线免费| 伊人久久五月天| 日韩av片免费在线观看| 欧美肥臀大乳一区二区免费视频| 欧美美最猛性xxxxxx| 欧美极品xxxx| 日韩精品视频中文在线观看| 久久亚洲综合国产精品99麻豆精品福利| 日韩免费高清在线观看| 国产一区二区三区在线观看视频| 亚洲欧洲av一区二区| 久久久久久久久久久免费精品| 91美女福利视频高清| 国产精品av在线播放| 国产精品视频99| 欧美多人乱p欧美4p久久| www国产91| 亚洲人成在线播放| 国产精品爱久久久久久久| 久久大大胆人体| 亚洲国产精品女人久久久| 久久人人爽人人| 在线观看亚洲视频| 久久精品视频在线| 国产欧美在线播放| 91香蕉嫩草影院入口| 另类少妇人与禽zozz0性伦| 国产精品一区二区久久久久| 国自产精品手机在线观看视频| 欧美日韩国产999| 久久99久久久久久久噜噜| 精品伊人久久97| 91精品久久久久久久久久久久久久| 日韩在线观看视频免费| 国产欧美va欧美va香蕉在| 国内成人精品视频| 日韩精品中文字幕在线| 热久久美女精品天天吊色| 国产精品久久久久久久久粉嫩av| 亚洲国产日韩欧美在线图片| 在线午夜精品自拍| 精品国模在线视频| 国产亚洲日本欧美韩国| 久久久久久久久电影| 中文字幕日韩av电影| 久久影院资源网| 美日韩精品视频免费看| 精品国产乱码久久久久酒店| 久久视频免费观看| 久久久国产精彩视频美女艺术照福利| 高清欧美电影在线| 亚洲精品国产福利| 美女视频黄免费的亚洲男人天堂| 欧美一区二区.| 播播国产欧美激情| 欧美大片免费看| 国产精品99久久99久久久二8| 精品动漫一区二区三区| 精品国产乱码久久久久久婷婷| 欧美大全免费观看电视剧大泉洋| 亚洲男人的天堂网站| 日韩免费观看高清| 日本在线观看天堂男亚洲| 亚洲欧美日韩精品久久亚洲区| www.99久久热国产日韩欧美.com| 亚洲人成亚洲人成在线观看| 国产成人激情小视频| 国产精品都在这里| 久久av红桃一区二区小说| 欧美日韩综合视频网址| 91福利视频网| 亚洲男人天堂2023| 夜夜嗨av一区二区三区免费区| 国产精品网站入口| 欧美亚洲在线观看| 91精品国产综合久久男男| 中文字幕综合在线| xvideos亚洲| 亚洲最大福利视频网站| 国内精品久久久|