最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#如何使用Task類解決線程的等待問題

 更新時間:2022年06月09日 10:44:52   作者:郝偉博士  
這篇文章主要介紹了C#如何使用Task類解決線程的等待問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用Task類解決線程的等待問題

在任何的編程語言中,面對耗時任務(wù)時,我們都會有這樣的需求:讓任務(wù)執(zhí)行一定時間,主任務(wù)進(jìn)行等待,如果到時仍然完成不了,那么就不再等待。

比如一個常見的應(yīng)用就是連接遠(yuǎn)程數(shù)據(jù)庫,如果由于網(wǎng)絡(luò)問題連接不上,那么只等待指定時間如3秒,然后就不再等待。

這樣的代碼如果自己寫類來實現(xiàn)的話并不困難,然而實際上C#已經(jīng)內(nèi)置了Task類用于解決此問題。

Task類

Task是C#中專門用于接收任務(wù)的類,通過構(gòu)造函數(shù)接收任務(wù),使用start()方法啟動。當(dāng)任務(wù)啟動以后,可以使用Task.WaitAll(Task[] tasks, int timeout) 等待所有任務(wù)完成后或時間到 timeout ms后再繼續(xù)。

注:由于Task的構(gòu)造函數(shù)接受的是Action委托,所以是沒有返回值的。

用法

Task核心功能是代理一個方法,然后在啟動,主線程可以指定等待時間,具體如以下代碼所示。

// 1. 初始化任務(wù)
var t1 = new Task(() => {
?? ??? ?Thread.Sleep(2000);
?? ??? ?Console.WriteLine("Hello");
?? ?}); ?
// 2. 啟動任務(wù)?? ?
t1.start();

// 3. 指定等等時間,單位為毫秒
Task.WaitAll(new Task[] { t1 }, 3000); ?

示例

在本示例中,我們啟動了一個簡單的任務(wù)t1,會暫時2秒然后輸出字符串“Hello”,然后主線程等待3000毫秒,代碼如下所示:

void Test1()
{
?? ?//定義一個任務(wù),等待2秒后輸出Hello?
?? ?var t1 = new Task(() => {
?? ??? ?Thread.Sleep(2000);
?? ??? ?Console.WriteLine("Hello");
?? ?}); ?
?
??? ?// 以多線程方式啟動任務(wù),t1和當(dāng)前線程是兩個線程
?? ?t1.Start();?
?? ?Console.WriteLine("t1 started.");

?? ?//等待所有任務(wù)結(jié)束(這里只有t1),程序會卡在這里。等待的時間為 3000 毫秒
?? ?Console.WriteLine("waiting...");
?? ?Task.WaitAll(new Task[] { t1 }, 3000); ?
?? ?Console.WriteLine("stop waiting.")

?? ?// 判斷t1任務(wù)是否完成
?? ?if (!t1.IsCompleted)
?? ??? ?Console.WriteLine("Running...");
?? ?Console.WriteLine("Task done.");
}?? ??? ??? ?

void print(string msg)
{
?? ?Console.WriteLine($"{DateTime.Now:HH:mm:ss.ffff} {msg}");
}

程序運行后輸出以下結(jié)果:

14:51:54.2233 t1 started.
14:51:54.2457 waiting...
14:51:56.2456 Hello
14:51:56.2456 stop waiting.
14:51:56.2456 Task done.

可以看到,程序在等待后約2000毫秒,任務(wù)t1執(zhí)行完成,輸出 Hello,但是由于我們設(shè)置的等待時間是3000毫秒,所以主線程仍然在等待中。在經(jīng)過了約3000毫秒后,程序停止等待,繼續(xù)執(zhí)行。在繼續(xù)執(zhí)行時,由于t1已經(jīng)執(zhí)行完成,所以沒有輸出繼續(xù)執(zhí)行的相關(guān)信息。

下面我們將上面的等待時間由3000毫秒改為1000毫秒,那么在執(zhí)行以后結(jié)果如下所示:

14:48:36.9624 t1 started.
14:48:36.9848 waiting...
14:48:37.9755 stop waiting.
14:48:37.9755 t1 still running...
14:48:37.9755 Task done.
14:48:38.9860 Hello

由以上結(jié)果可見,程序在等待了約1000毫秒后,由于等待時間已經(jīng)到了,就繼續(xù)向前執(zhí)行,此時 t1 并沒有執(zhí)行完成,所以會輸出 “t1 still running…”。等主線程執(zhí)行完以后,t1 最終執(zhí)行完成,輸出了Hello。

小結(jié)

由以上示例可見,Task能夠很方便的啟動一個任務(wù),主線程也可以決定等待時間。

不過這里還有三點需要注意一下:

1)Task沒有返回值;

2)主線程不能中止Task;

3)計時精度不高,有一定的誤差。

基于以上問題,我們可以知道Task類合適用在一些對控制和計時精度要求不高的場合。

C#代碼執(zhí)行中等待10秒

//等待10秒
DateTime dt1 = DateTime.Now;
while ((DateTime.Now - dt1).TotalMilliseconds < 10000)
{
continue;
};

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#使用MathNet生成矩陣并打印矩陣元素

    C#使用MathNet生成矩陣并打印矩陣元素

    MathNet.Numerics中提供了線性代數(shù)、微積分、特殊函數(shù)、概率論、隨機函數(shù)、插值、最優(yōu)化等一系列功能,是.net技術(shù)中首選的數(shù)值計算包,本文給大家介紹了C#如何使用MathNet生成矩陣并打印矩陣元素,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • C#使用foreach循環(huán)遍歷數(shù)組完整實例

    C#使用foreach循環(huán)遍歷數(shù)組完整實例

    這篇文章主要介紹了C#使用foreach循環(huán)遍歷數(shù)組,結(jié)合完整實例形式較為詳細(xì)的分析了C#遍歷數(shù)組的相關(guān)技巧,需要的朋友可以參考下
    2016-06-06
  • C#的XML兩種代碼注釋實例說明

    C#的XML兩種代碼注釋實例說明

    在C/C++,JAVA中,有兩種注釋,一種是單行注釋,即兩根反斜杠(//),另一種是多行注釋,即以/*開頭,以*/結(jié)尾,本文將詳細(xì)介紹,需要的朋友可以參考下
    2012-12-12
  • C# winform點擊生成二維碼實例代碼

    C# winform點擊生成二維碼實例代碼

    這篇文章主要介紹了 C# winform點擊生成二維碼實例代碼,需要的朋友可以參考下
    2017-04-04
  • C#中string.format用法詳解

    C#中string.format用法詳解

    這篇文章主要介紹了C#中string.format用法,以實例形式較為詳細(xì)的講述了string.format格式化的各種用法,非常具有實用價值,需要的朋友可以參考下
    2014-11-11
  • C#中的協(xié)變與逆變深入講解

    C#中的協(xié)變與逆變深入講解

    這篇文章主要給大家介紹了關(guān)于C#中協(xié)變與逆變的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 深入分析WPF客戶端讀取高清圖片卡以及縮略圖的解決方法詳解

    深入分析WPF客戶端讀取高清圖片卡以及縮略圖的解決方法詳解

    本篇文章是對WPF客戶端讀取高清圖片卡以及縮略圖的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C# WinForm開發(fā)中使用XML配置文件實例

    C# WinForm開發(fā)中使用XML配置文件實例

    這篇文章主要介紹了C# WinForm開發(fā)中使用XML配置文件實例,本文詳細(xì)講解了如何使用一個XML文件作為WinForm的配置文件,需要的朋友可以參考下
    2014-08-08
  • Unity3D實戰(zhàn)之答題系統(tǒng)的實現(xiàn)

    Unity3D實戰(zhàn)之答題系統(tǒng)的實現(xiàn)

    本文將用Unity3D制作一個答題系統(tǒng),可以從文本文檔中提取題目和分?jǐn)?shù),然后綁定到UI上,在答題的過程中,自動判斷分?jǐn)?shù),自動判斷正確率。感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • C#線程開發(fā)之System.Thread類詳解

    C#線程開發(fā)之System.Thread類詳解

    本文詳細(xì)講解了C#線程開發(fā)之System.Thread類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

青海省| 濉溪县| 宜都市| 鹿泉市| 育儿| 绥宁县| 蛟河市| 汤阴县| 湖南省| 英山县| 万源市| 永福县| 蒲江县| 古蔺县| 博白县| 莱阳市| 明溪县| 永济市| 北辰区| 金塔县| 丹凤县| 长岛县| 阜新市| 酉阳| 屯门区| 沾益县| 宜宾县| 会同县| 花垣县| 阜城县| 南宁市| 山阴县| 岳阳县| 彰化县| 沂南县| 平定县| 广饶县| 靖边县| 井冈山市| 古交市| 开江县|