C#異步延遲Task.Delay


一.

1.Task.Delay實質是創建一個任務,再任務中開啟一個定時間,然后延時指定的時間
2.Task.Delay不和await一起使用情況,當代碼遇到Task.Delay一句時,創建了了一個新的任務去執行延時去了,當前代碼繼續往下執行
3.Task.Delay和await一起使用,當代碼遇到await Task.Delay時候,當前線程要等該行代碼執行完成后,再繼續執行后面的代碼

 

代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _006__Task.Delay
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnDelayNoAwait_Click(object sender, EventArgs e)
        {
            Task task = Task.Factory.StartNew(() =>
            {
                Console.WriteLine($" Task.Delay開始:{DateTime.Now.ToString(" HH:mm:ss.fff")}");
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 正在進行:{i}");
                    Task.Delay(2000);
                }
                Console.WriteLine($" Task.Delay結束:{DateTime.Now.ToString("HH:mm:ss.fff")}");
                Console.ReadKey();
            });

        }

        private void btnDelayHaveAwait_Click(object sender, EventArgs e)
        {
            Task task = Task.Factory.StartNew(async () =>
            {
                Console.WriteLine($" Task.Delay 有await 開始:{DateTime.Now.ToString("HH:mm:ss.fff")}");
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 有await正在進行:{i}");
                    await Task.Delay(2000);
                }
                Console.WriteLine($" Task.Delay 有await 結束:{DateTime.Now.ToString("HH:mm:ss.fff")}");
                Console.ReadKey();
            });
        }

        private void btnThreadSleep_Click(object sender, EventArgs e)
        {
            Task task = Task.Factory.StartNew(() =>
           {
               Console.WriteLine($" Task.Delay 有await 開始:{DateTime.Now.ToString("HH:mm:ss.fff")}");
               for (int i = 0; i < 10; i++)
               {
                   Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 有await正在進行:{i}");
                   Thread.Sleep(2000);
               }
               Console.WriteLine($" Task.Delay 有await 結束:{DateTime.Now.ToString("HH:mm:ss.fff")}");
               Console.ReadKey();
           });
        }
    }
}

 

按鈕【Task.Delay(不帶await)】執行結果:

當程序遇到 Task.Delay(2000);時候,程序創建一個新的任務去執行延時2000了,當前任務繼續向下執行,所以看起來並沒有延時2秒的現象。

例如:你只有先寫完作業,然后才能看電視。但是到寫作業的時候,你讓其他人幫你寫(開啟新的任務去執行延時),你繼續去看電視(繼續當前任務)。

 

 

 

 按鈕【Task.Delay(帶await)】執行結果(推薦):

當程序遇到 await Task.Delay(2000);時候,當前任務,要等到新創建的任務執行完延時2000后,才繼續后面的代碼
例如:你只有先寫完作業,然后才能看電視。但是到寫作業的時候,你mother在旁邊看着你,直到你寫完作業(開啟新的任務去執行延時),你才可以繼續去看電視(繼續當前任務)。

 

 

 

按鈕【Thread.Sleep()】執行結果(不推薦):

Thread.Sleep 是讓當前線程休眠指定的時間。在異步中是不推薦使用Thread.Sleep 的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM