国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理

這篇具有很好參考價(jià)值的文章主要介紹了Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理

目錄

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理

一、Task、async和 await 、Thread 基礎(chǔ)概念

1、線程,多線程

2、Task

?3、async (await )

二、Task 的基礎(chǔ)使用,Task 的創(chuàng)建 和 啟動(dòng)

1、創(chuàng)建并運(yùn)行一個(gè)Task

2、創(chuàng)建有返回值的 Task

3、Task提供了 task.RunSynchronously()用于同步執(zhí)行Task任務(wù)

三、Task的阻塞方法(Wait/WaitAll/WaitAny)

1、Thread 阻塞主線程方法 : thread.Join()方法

2、Task提供了 Wait/WaitAny/WaitAll 方法,可以更方便地控制線程阻塞

四、Task的延續(xù)操作(WhenAny/WhenAll/ContinueWith)

1、Task 的延續(xù)操作(WhenAny/WhenAll/ContinueWith)

?2、Task.Factory 的延續(xù)操作(WhenAny/WhenAll/ContinueWith)

五、Task 的任務(wù)取消(CancellationTokenSource)

1、Thread 的任務(wù)取消

?2、Task 的任務(wù)取消

3、 CancellationTokenSource? 中 source.Token.Register 和 source.CancelAfter(XXXXms)

?五、異步方法(async/await)

六、Task、async和 await 、Thread 簡(jiǎn)單小結(jié)


一、Task、async和 await 、Thread 基礎(chǔ)概念

1、線程,多線程

線程(Thread)是進(jìn)程中的基本執(zhí)行單元,是操作系統(tǒng)分配CPU時(shí)間的基本單位,一個(gè)進(jìn)程可以包含若干個(gè)線程,在進(jìn)程入口執(zhí)行的第一個(gè)線程被視為這個(gè)進(jìn)程的主線程。

在.NET應(yīng)用程序中,都是以Main()方法作為入口的,當(dāng)調(diào)用此方法時(shí)系統(tǒng)就會(huì)自動(dòng)創(chuàng)建一個(gè)主線程。線程主要是由CPU寄存器、調(diào)用棧和線程本地存儲(chǔ)器(Thread Local Storage,TLS)組成的

CPU寄存器主要記錄當(dāng)前所執(zhí)行線程的狀態(tài),調(diào)用棧主要用于維護(hù)線程所調(diào)用到的內(nèi)存與數(shù)據(jù),TLS主要用于存放線程的狀態(tài)信息。

多線程:可以同時(shí)完成多個(gè)任務(wù);可以使程序的響應(yīng)速度更快;可以讓占用大量處理時(shí)間的任務(wù)或當(dāng)前沒有進(jìn)行處理的任務(wù)定期將處理時(shí)間讓給別的任務(wù);可以隨時(shí)停止任務(wù);可以設(shè)置每個(gè)任務(wù)的優(yōu)先級(jí)以優(yōu)化程序性能。

class Program
    {
        static void Main(string[] args)
        {
            //創(chuàng)建無參的線程
            Thread thread1 = new Thread(new ThreadStart(Thread1));
            //調(diào)用Start方法執(zhí)行線程
            thread1.Start();

            Console.ReadKey();
        }

        /// <summary>
        /// 創(chuàng)建無參的方法
        /// </summary>
        static void Thread1()
        {
            Console.WriteLine("這是無參的方法");
        }
    }

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

2、Task

Task 是在ThreadPool的基礎(chǔ)上推出的,我們簡(jiǎn)單了解下ThreadPool。

  • ThreadPool中有若干數(shù)量的線程,如果有任務(wù)需要處理時(shí),會(huì)從線程池中獲取一個(gè)空閑的線程來執(zhí)行任務(wù),任務(wù)執(zhí)行完畢后線程不會(huì)銷毀,而是被線程池回收以供后續(xù)任務(wù)使用。
  • 當(dāng)線程池中所有的線程都在忙碌時(shí),又有新任務(wù)要處理時(shí),線程池才會(huì)新建一個(gè)線程來處理該任務(wù)
  • 如果線程數(shù)量達(dá)到設(shè)置的最大值,任務(wù)會(huì)排隊(duì),等待其他任務(wù)釋放線程后再執(zhí)行。
  • 線程池能減少線程的創(chuàng)建,節(jié)省開銷,如下看一個(gè)ThreadPool的使用
 static void Main(string[] args)
 {
       for (int i = 1; i <=10; i++)
       {
                //ThreadPool執(zhí)行任務(wù)
                ThreadPool.QueueUserWorkItem(new WaitCallback((obj) => {
                    Console.WriteLine($"第{obj}個(gè)執(zhí)行任務(wù)");
                }),i);
       }
     Console.ReadKey();
}

上邊的代碼通過ThreadPool執(zhí)行了10個(gè)任務(wù),執(zhí)行結(jié)果為

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

?3、async (await )

async? 異步主要用于修飾方法。

當(dāng)一個(gè)方法被調(diào)用時(shí),調(diào)用者需要等待該方法執(zhí)行完畢并返回才能繼續(xù)執(zhí)行,我們稱這個(gè)方法是同步方法;

當(dāng)一個(gè)方法被調(diào)用時(shí),立即返回,并獲取一個(gè)線程執(zhí)行該方法內(nèi)部的業(yè)務(wù),調(diào)用者不用等待該方法執(zhí)行完畢,我們稱這個(gè)方法為異步方法。

異步的好處在于非阻塞(調(diào)用線程不會(huì)暫停執(zhí)行去等待子線程完成),因此我們把一些不需要立即使用結(jié)果、較耗時(shí)的任務(wù)設(shè)為異步執(zhí)行,可以提高程序的運(yùn)行效率。

C# 中的 async 和 await 關(guān)鍵字,異步編程非常流行。

1)當(dāng)我們?cè)谔幚?UI 時(shí),在點(diǎn)擊按鈕時(shí),我們使用了一個(gè)長時(shí)間運(yùn)行的方法,比如讀取一個(gè)大文件或其他需要很長時(shí)間的東西

2)在這種情況下,整個(gè)應(yīng)用程序必須等待完成整個(gè)任務(wù)。

3)換句話說,如果同步應(yīng)用程序中的任何進(jìn)程被阻塞,整個(gè)應(yīng)用程序都會(huì)被阻塞,我們的應(yīng)用程序會(huì)停止響應(yīng),直到整個(gè)任務(wù)完成。

異步編程在這種情況下非常有用。通過使用異步編程,應(yīng)用程序可以繼續(xù)進(jìn)行不依賴于整個(gè)任務(wù)完成的其他工作。

net4.0在ThreadPool的基礎(chǔ)上推出了Task類,微軟極力推薦使用Task來執(zhí)行異步任務(wù),現(xiàn)在C#類庫中的異步方法基本都用到了Task;

net5.0推出了async/await,讓異步編程更為方便。

二、Task 的基礎(chǔ)使用,Task 的創(chuàng)建 和 啟動(dòng)

我們知道了ThreadPool的弊端:

(1)我們不能控制線程池中線程的執(zhí)行順序,

(2)也不能獲取線程池內(nèi)線程取消/異常/完成的通知。

net4.0在ThreadPool的基礎(chǔ)上推出了Task

(1)Task擁有線程池的優(yōu)點(diǎn)

(2)同時(shí)也解決了使用線程池不易控制的弊端

1、創(chuàng)建并運(yùn)行一個(gè)Task

首先看一下怎么去創(chuàng)建并運(yùn)行一個(gè)Task,Task的 創(chuàng)建 和 啟動(dòng) 執(zhí)行的方式有如下三種:

  • Task task = new Task(); task.Start();
  • Task task = Task.Factory.StartNew();
  • Task task = Task.Run();
 		 static void Main(string[] args)
        {
            //1.new方式實(shí)例化一個(gè)Task,需要通過Start方法啟動(dòng)
            Task task = new Task(() =>
            {
                Thread.Sleep(100);
                Console.WriteLine($"hello, task1的線程ID為{Thread.CurrentThread.ManagedThreadId}");
            });
            task.Start();

            //2.Task.Factory.StartNew(Action action)創(chuàng)建和啟動(dòng)一個(gè)Task
            Task task2 = Task.Factory.StartNew(() =>
              {
                  Thread.Sleep(100);
                  Console.WriteLine($"hello, task2的線程ID為{ Thread.CurrentThread.ManagedThreadId}");
              });

            //3.Task.Run(Action action)將任務(wù)放在線程池隊(duì)列,返回并啟動(dòng)一個(gè)Task
            Task task3 = Task.Run(() =>
              {
                  Thread.Sleep(100);
                  Console.WriteLine($"hello, task3的線程ID為{ Thread.CurrentThread.ManagedThreadId}");
              });
            Console.WriteLine("執(zhí)行主線程!");
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下,我們看到先打印"執(zhí)行主線程",然后再打印各個(gè)任務(wù),說明了Task不會(huì)阻塞主線程:

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

2、創(chuàng)建有返回值的 Task

上邊的代碼中 Task 都沒有返回值,我們也可以創(chuàng)建有返回值的 Task,用法和沒有返回值的基本一致,我們簡(jiǎn)單修改一下上邊的栗子,代碼如下:

?Task<數(shù)據(jù)類型>,task.Result 獲取結(jié)果

值得注意的是 :task.Resut獲取結(jié)果時(shí)會(huì)阻塞線程,即如果task沒有執(zhí)行完成,會(huì)等待task執(zhí)行完成獲取到Result,然后再執(zhí)行后邊的代碼

  • Task<string> task = new Task(); task.Start();
  • Task<string> task = Task.Factory.StartNew();
  • Task<string> task = Task.Run();
         static void Main(string[] args)
        {
            //1.new方式實(shí)例化一個(gè)Task,需要通過Start方法啟動(dòng)
            Task<string> task = new Task<string>(() =>
            {
                return $"hello, task1的ID為{Thread.CurrentThread.ManagedThreadId}";
            });
            task.Start();

            //2.Task.Factory.StartNew(Func func)創(chuàng)建和啟動(dòng)一個(gè)Task
           Task<string> task2 =Task.Factory.StartNew<string>(() =>
            {
                return $"hello, task2的ID為{ Thread.CurrentThread.ManagedThreadId}";
            });

            //3.Task.Run(Func func)將任務(wù)放在線程池隊(duì)列,返回并啟動(dòng)一個(gè)Task
           Task<string> task3= Task.Run<string>(() =>
            {
                return $"hello, task3的ID為{ Thread.CurrentThread.ManagedThreadId}";
            });

            Console.WriteLine("執(zhí)行主線程!");
            Console.WriteLine(task.Result);
            Console.WriteLine(task2.Result);
            Console.WriteLine(task3.Result);
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下:

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

3、Task提供了 task.RunSynchronously()用于同步執(zhí)行Task任務(wù)

上邊的所有代碼中Task的執(zhí)行都是異步的,不會(huì)阻塞主線程。有些場(chǎng)景下我們想讓Task同步執(zhí)行怎么辦呢?Task提供了 task.RunSynchronously()用于同步執(zhí)行Task任務(wù)

  • Task task = new Task(); task.RunSynchronously();
        static void Main(string[] args)
        {
            Task task = new Task(() =>
            {
                Thread.Sleep(100);
                Console.WriteLine("執(zhí)行Task結(jié)束!");
            });
            //同步執(zhí)行,task會(huì)阻塞主線程
            task.RunSynchronously();
            Console.WriteLine("執(zhí)行主線程結(jié)束!");
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下:

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

三、Task的阻塞方法(Wait/WaitAll/WaitAny)

1、Thread 阻塞主線程方法 : thread.Join()方法

Thread的 Join 方法 可以阻塞調(diào)用線程,但是有一些弊端:

如果我們要實(shí)現(xiàn)很多線程的阻塞時(shí),每個(gè)線程都要調(diào)用一次Join方法;

如果我們想讓所有的線程執(zhí)行完畢(或者任一線程執(zhí)行完畢)時(shí),立即解除阻塞,使用Join方法不容易實(shí)現(xiàn)。

參考代碼如下

          static void Main(string[] args)
        {
            Thread th1 = new Thread(() => {
                Thread.Sleep(500);
                Console.WriteLine("線程1執(zhí)行完畢!");
            });
            th1.Start();
            Thread th2 = new Thread(() => {
                Thread.Sleep(1000);
                Console.WriteLine("線程2執(zhí)行完畢!");
            });
            th2.Start();
            //阻塞主線程
            th1.Join();
            th2.Join();
            Console.WriteLine("主線程執(zhí)行完畢!");
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下:

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

2、Task提供了 Wait/WaitAny/WaitAll 方法,可以更方便地控制線程阻塞

  • Task.Wait() 表示等待task執(zhí)行完畢,功能類似于thead.Join();
  • Task.WaitAll(Task[] tasks) 表示只有所有的task都執(zhí)行完成了再解除阻塞;
  • Task.WaitAny(Task[] tasks)表示只要有一個(gè)task執(zhí)行完畢就解除阻塞;

參考代碼如下:

        static void Main(string[] args)
        {
            Task task1 = new Task(() => {
                Thread.Sleep(500);
                Console.WriteLine("線程1執(zhí)行完畢!");
            });
            task1.Start();
            Task task2 = new Task(() => {
                Thread.Sleep(1000);
                Console.WriteLine("線程2執(zhí)行完畢!");
            });
            task2.Start();
            //阻塞主線程。task1,task2都執(zhí)行完畢再執(zhí)行主線程
            //執(zhí)行【task1.Wait();task2.Wait();】可以實(shí)現(xiàn)相同功能
            Task.WaitAll(new Task[] { task1, task2 });
            Console.WriteLine("主線程執(zhí)行完畢!");
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

四、Task的延續(xù)操作(WhenAny/WhenAll/ContinueWith)

1、Task 的延續(xù)操作(WhenAny/WhenAll/ContinueWith)

上邊的 Wait/WaitAny/WaitAll 方法返回值為 void,這些方法單純的實(shí)現(xiàn)阻塞線程。

我們現(xiàn)在想:讓所有 task 執(zhí)行完畢 (或者任一task執(zhí)行完畢) 后,開始執(zhí)行后續(xù)操作,怎么實(shí)現(xiàn)呢?

這時(shí)就可以用到WhenAny/WhenAll方法了,這些方法執(zhí)行完成返回一個(gè)task實(shí)例。

  • task.WhenAll(Task[] tasks) 表示所有的task都執(zhí)行完畢后再去執(zhí)行后續(xù)的操作
  • task.WhenAny(Task[] tasks) 表示任一task執(zhí)行完畢后就開始執(zhí)行后續(xù)操作

參考代碼如下:

        static void Main(string[] args)
        {
            Task task1 = new Task(() => {
                Thread.Sleep(500);
                Console.WriteLine("線程1執(zhí)行完畢!");
            });
            task1.Start();
            Task task2 = new Task(() => {
                Thread.Sleep(1000);
                Console.WriteLine("線程2執(zhí)行完畢!");
            });
            task2.Start();
            //task1,task2執(zhí)行完了后執(zhí)行后續(xù)操作
            Task.WhenAll(task1, task2).ContinueWith((t) => {
                Thread.Sleep(100);
                Console.WriteLine("執(zhí)行后續(xù)操作完畢!");
            });

            Console.WriteLine("主線程執(zhí)行完畢!");
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下:

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

?2、Task.Factory 的延續(xù)操作(WhenAny/WhenAll/ContinueWith)

上邊的栗子也可以通過 Task.Factory.ContinueWhenAll(Task[] tasks, Action continuationAction)和 Task.Factory.ContinueWhenAny(Task[] tasks, Action continuationAction) 來實(shí)現(xiàn)

修改上邊代碼如下

        static void Main(string[] args)
        {
            Task task1 = new Task(() => {
                Thread.Sleep(500);
                Console.WriteLine("線程1執(zhí)行完畢!");
            });
            task1.Start();
            Task task2 = new Task(() => {
                Thread.Sleep(1000);
                Console.WriteLine("線程2執(zhí)行完畢!");
            });
            task2.Start();
            //通過TaskFactroy實(shí)現(xiàn)
            Task.Factory.ContinueWhenAll(new Task[] { task1, task2 }, (t) =>
            {
                Thread.Sleep(100);
                Console.WriteLine("執(zhí)行后續(xù)操作");
            });

            Console.WriteLine("主線程執(zhí)行完畢!");
            Console.ReadKey();
        }

運(yùn)行結(jié)果不變,如下

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

五、Task 的任務(wù)取消(CancellationTokenSource)

1、Thread 的任務(wù)取消

在Task前我們執(zhí)行任務(wù)采用的是Thread,Thread怎么取消任務(wù)呢?

一般流程是:

  • 1)設(shè)置一個(gè)變量來控制任務(wù)是否停止,如設(shè)置一個(gè)變量isStop
  • 2)然后線程輪詢查看isStop,如果isStop為true就停止

參考代碼如下:

        static void Main(string[] args)
        {
            bool isStop = false;
            int index = 0;
            //開啟一個(gè)線程執(zhí)行任務(wù)
            Thread th1 = new Thread(() =>
            {
                while (!isStop)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"第{++index}次執(zhí)行,線程運(yùn)行中...");
                }
            });
            th1.Start();
            //五秒后取消任務(wù)執(zhí)行
            Thread.Sleep(5000);
            isStop = true;
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

?2、Task 的任務(wù)取消

Task中有一個(gè)專門的類 CancellationTokenSource 來取消任務(wù)執(zhí)行

還是使用上邊的例子,調(diào)整代碼如下

        static void Main(string[] args)
        {
            CancellationTokenSource source = new CancellationTokenSource();
            int index = 0;
            //開啟一個(gè)task執(zhí)行任務(wù)
            Task task1 = new Task(() =>
            {
                while (!source.IsCancellationRequested)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"第{++index}次執(zhí)行,線程運(yùn)行中...");
                }
            });
            task1.Start();
            //五秒后取消任務(wù)執(zhí)行
            Thread.Sleep(5000);
            //source.Cancel()方法請(qǐng)求取消任務(wù),IsCancellationRequested會(huì)變成true
            source.Cancel();
            Console.ReadKey();
        }

程序運(yùn)行的效果不變,如下

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

3、 CancellationTokenSource? 中 source.Token.Register 和 source.CancelAfter(XXXXms)

CancellationTokenSource 的功能不僅僅是取消任務(wù)執(zhí)行,我們可以使用

  • source.CancelAfter(5000)實(shí)現(xiàn)5秒后自動(dòng)取消任務(wù)
  • source.Token.Register(Action action) 可以注冊(cè)取消任務(wù)觸發(fā)的回調(diào)函數(shù),即任務(wù)被取消時(shí)注冊(cè)的action會(huì)被執(zhí)行

參考代碼如下

        static void Main(string[] args)
        {
            CancellationTokenSource source = new CancellationTokenSource();
            //注冊(cè)任務(wù)取消的事件
            source.Token.Register(() =>
            {
                Console.WriteLine("任務(wù)被取消后執(zhí)行xx操作!");
            });

            int index = 0;
            //開啟一個(gè)task執(zhí)行任務(wù)
            Task task1 = new Task(() =>
            {
                while (!source.IsCancellationRequested)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"第{++index}次執(zhí)行,線程運(yùn)行中...");
                }
            });
            task1.Start();
            //延時(shí)取消,效果等同于Thread.Sleep(5000);source.Cancel();
            source.CancelAfter(5000);
            Console.ReadKey();
        }

運(yùn)行結(jié)果如下

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

?五、異步方法(async/await)

在 C# 5.0 中出現(xiàn)的 async 和 await ,讓異步編程變得更簡(jiǎn)單。

此方法利用了 .NET Framework 4.5 及更高版本、.NET Core 和 Windows 運(yùn)行時(shí)中的異步支持。

編譯器可執(zhí)行開發(fā)人員曾進(jìn)行的高難度工作,且應(yīng)用程序保留了一個(gè)類似于同步代碼的邏輯結(jié)構(gòu)。

  • async 用在方法定義前面,await只能寫在帶有async標(biāo)記的方法中。
  • 注意await異步等待的地方,await后面的代碼和前面的代碼執(zhí)行的線程可能不一樣
  • async關(guān)鍵字創(chuàng)建了一個(gè)狀態(tài)機(jī),類似yield return 語句;await會(huì)解除當(dāng)前線程的阻塞,完成其他任務(wù)

這里實(shí)現(xiàn)同步異步讀取文件內(nèi)容的方式。

我們可以看到異步讀取代碼和同步讀取代碼基本一致。async/await讓異步編碼變得更簡(jiǎn)單,我們可以像寫同步代碼一樣去寫異步代碼。

注意一個(gè)小問題:異步方法中方法簽名返回值為Task,代碼中的返回值為T。

代碼中GetContentAsync的簽名返回值為Task,而代碼中返回值為string。牢記這一細(xì)節(jié)對(duì)我們分析異步代碼很有幫助。

異步方法簽名的返回值有以下三種:

  • Task:如果調(diào)用方法想通過調(diào)用異步方法獲取一個(gè)T類型的返回值,那么簽名必須為Task;
  • Task:如果調(diào)用方法不想通過異步方法獲取一個(gè)值,僅僅想追蹤異步方法的執(zhí)行狀態(tài),那么我們可以設(shè)置異步方法簽名的返回值為Task;
  • void:如果調(diào)用方法僅僅只是調(diào)用一下異步方法,不和異步方法做其他交互,我們可以設(shè)置異步方法簽名的返回值為void,這種形式也叫做“調(diào)用并忘記”。

參考代碼如下

        static void Main(string[] args)
        {
            //Console.WriteLine(" Environment.CurrentDirectory "+ Environment.CurrentDirectory);
            string content = GetContentAsync(Environment.CurrentDirectory + @"/test.txt").Result;
            //調(diào)用同步方法
            //string content = GetContent(Environment.CurrentDirectory + @"/test.txt");
            Console.WriteLine(content);
            Console.ReadKey();
        }
 
        /// <summary>
        /// 異步讀取文件內(nèi)容
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        async static Task<string> GetContentAsync(string filename)
        {

            FileStream fs = new FileStream(filename, FileMode.Open);
            var bytes = new byte[fs.Length];
            //ReadAync方法異步讀取內(nèi)容,不阻塞線程
            Console.WriteLine("開始讀取文件");
            int len = await fs.ReadAsync(bytes, 0, bytes.Length);
            string result = Encoding.UTF8.GetString(bytes);
            return result;
        }

        /// <summary>
        /// 同步讀取文件內(nèi)容
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        static string GetContent(string filename)
        {
            FileStream fs = new FileStream(filename, FileMode.Open);
            var bytes = new byte[fs.Length];
            //Read方法同步讀取內(nèi)容,阻塞線程
            int len = fs.Read(bytes, 0, bytes.Length);
            string result = Encoding.UTF8.GetString(bytes);
            return result;
        }

運(yùn)行結(jié)果如下:

Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理,Unity,c#,Task,Thread,async await,異步

六、Task、async和 await 、Thread 簡(jiǎn)單小結(jié)

最后我們簡(jiǎn)單記住一些特性,就可以有個(gè)較好的理解他們了:文章來源地址http://www.zghlxwxcb.cn/news/detail-664354.html

  • 1)async/await是基于Task的
  • 2)而Task是對(duì)ThreadPool的封裝改進(jìn),主要是為了更有效的控制線程池中的線程(ThreadPool中的線程,我們很難通過代碼控制其執(zhí)行順序,任務(wù)延續(xù)和取消等等);
  • 3)ThreadPool基于Thread的,主要目的是減少Thread創(chuàng)建數(shù)量和管理Thread的成本。
  • 4)async/await Task是C#中更先進(jìn)的,也是微軟大力推廣的特性
  • 5)我們?cè)陂_發(fā)中可以嘗試使用Task來替代Thread/ThreadPool,處理本地IO和網(wǎng)絡(luò)IO任務(wù)是盡量使用async/await來提高任務(wù)執(zhí)行效率。

到了這里,關(guān)于Unity C# 之 Task、async和 await 、Thread 基礎(chǔ)使用的Task的簡(jiǎn)單整理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#中await /async 的使用場(chǎng)景,優(yōu)點(diǎn),使用方法介紹

    C#中await /async 的使用場(chǎng)景,優(yōu)點(diǎn),使用方法介紹

    ? async/await ?是 C# 中異步編程的關(guān)鍵特性,它使得異步代碼編寫更為簡(jiǎn)單和直觀。下面深入詳細(xì)描述了? async/await ?的使用場(chǎng)景、優(yōu)點(diǎn)以及一些高級(jí)使用方法,并提供了相應(yīng)的實(shí)例源代碼。 I/O 操作: ?異步編程特別適用于涉及 I/O 操作(如文件讀寫、網(wǎng)絡(luò)請(qǐng)求等)的場(chǎng)景。在

    2024年02月05日
    瀏覽(17)
  • c# 使用了 await、asnync task.run 三者結(jié)合使用

    在 C# 異步編程中,`await` 和 `async` 結(jié)合使用可以讓你更方便地編寫異步代碼,而無需直接使用 `Task.Run`。然而,有時(shí)候你可能仍然需要使用 `Task.Run` 來在后臺(tái)線程上執(zhí)行某些工作,這取決于你的代碼邏輯和需求。 `await` 和 `async` 通常用于異步等待 IO 操作,如網(wǎng)絡(luò)

    2024年02月11日
    瀏覽(25)
  • 【C#】async和await 續(xù)

    【C#】async和await 續(xù)

    在文章《async和await》中,我們觀察到了一下客觀的規(guī)律,但是沒有講到本質(zhì),而且還遺留了一個(gè)問題: 這篇文章中,我們繼續(xù)看看這個(gè)問題如何解決! 我們?cè)倏纯粗皩懙拇a: 當(dāng)時(shí)問題是,為啥 Task.Factory.StartNew 可以看到異步效果,而Task.Run中卻是同步效果。 那其實(shí)是因?yàn)?/p>

    2024年02月15日
    瀏覽(23)
  • async/await 與console(C#)

    上一篇async/await 致WPF卡死問題(https://www.cnblogs.com/stephen2023/p/17725159.html),介紹主線程阻塞,async/await導(dǎo)致卡死問題,同樣的代碼在console下卻并不會(huì)出現(xiàn)卡死。 并且await后的任務(wù)也是由“新線程”執(zhí)行的,并非主線程執(zhí)行。 對(duì)于如下含await的代碼 可以類比于: WPF與Console不同

    2024年02月08日
    瀏覽(18)
  • C#異步方法async/await的三種返回類型

    有群友問C#異步方法async返回值Task和void的區(qū)別?看似簡(jiǎn)單,但不容易把它們用好。在C#中的異步編程已經(jīng)成為現(xiàn)代編程的標(biāo)配,異步方法(async/await)是實(shí)現(xiàn)異步編程的一種常用方式。在異步方法中,可以使用 Task 或 void 作為返回類型,還可以使用ValueTask返回類型。本文將介紹

    2024年02月04日
    瀏覽(22)
  • async/await 在 C# 語言中是如何工作的?(下)

    async/await 在 C# 語言中是如何工作的?(下)

    接《async/await 在 C# 語言中是如何工作的?(上)》、《async/await 在 C# 語言中是如何工作的?(中)》,今天我們繼續(xù)介紹?SynchronizationContext 和 ConfigureAwait。 ? ▌SynchronizationContext 和 ConfigureAwait 我們之前在 EAP 模式的上下文中討論過 SynchronizationContext,并提到它將再次出現(xiàn)。

    2024年02月08日
    瀏覽(24)
  • Unity 中的 async/await:優(yōu)雅處理異步任務(wù)與協(xié)程

    內(nèi)容將會(huì)持續(xù)更新,有錯(cuò)誤的地方歡迎指正,謝謝! ? Unity 中的 async/await:優(yōu)雅處理異步任務(wù)與協(xié)程Coroutine ? ? ? TechX 堅(jiān)持將創(chuàng)新的科技帶給世界! 擁有更好的學(xué)習(xí)體驗(yàn) —— 不斷努力,不斷進(jìn)步,不斷探索 TechX —— 心探索、心進(jìn)??! 助力快速掌握 async/await 異步等待 為初

    2024年02月06日
    瀏覽(32)
  • 深入探討 C# 和 .NET 中 async/await 的歷史、背后的設(shè)計(jì)決策和實(shí)現(xiàn)細(xì)節(jié)

    對(duì) async/await 的支持已經(jīng)存在了十多年。它的出現(xiàn),改變了為 .NET 編寫可伸縮代碼的方式,你在不了解幕后的情況下也可以非常普遍地使用該功能。 從如下所示的同步方法開始(此方法是“ 同步的 ”,因?yàn)樵谡麄€(gè)操作完成并將控制權(quán)返回給調(diào)用方之前,調(diào)用方將無法執(zhí)行任何

    2024年02月08日
    瀏覽(28)
  • async和await的的基本使用

    說明: await’ expressions are only allowed within async functions and at the top levels of modules.ts(1308)

    2024年02月13日
    瀏覽(29)
  • JavaScript:深入探索async/await的使用

    在JavaScript的異步編程領(lǐng)域,ES8引入的 async/await 語法是一項(xiàng)重要的創(chuàng)新。它讓異步代碼看起來更像同步代碼,使得處理異步操作變得更加清晰和簡(jiǎn)潔。本文將深入探索 async/await 的使用,幫助你充分發(fā)揮這項(xiàng)技術(shù)的優(yōu)勢(shì)。 1. 什么是 async/await ? ? async/await 是一種基于Promise的異步

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包