做淘寶客網(wǎng)站用什么系統(tǒng)谷歌瀏覽器安卓版
1.Thread的使用?
Thread的使用參考:【C#】Thread的使用
2.CancellationTokenSource 的使用
CancellationTokenSource
在C#中用于取消長(zhǎng)時(shí)間運(yùn)行的操作,如異步或后臺(tái)任務(wù)。它允許你從外部請(qǐng)求一個(gè)操作的取消,并且被取消的操作可以通過檢查CancellationToken
來響應(yīng)這個(gè)請(qǐng)求。
下面是一個(gè)簡(jiǎn)單的示例,展示了如何使用CancellationTokenSource
:
using System;
using System.Threading;
using System.Threading.Tasks;class Program
{static void Main(){// 創(chuàng)建一個(gè) CancellationTokenSource 對(duì)象CancellationTokenSource cts = new CancellationTokenSource();// 從 CancellationTokenSource 中獲取 CancellationTokenCancellationToken token = cts.Token;// 啟動(dòng)一個(gè)異步任務(wù)并傳入 CancellationTokenTask task = Task.Run(async () =>{for (int i = 0; i < 10; i++){// 檢查是否已請(qǐng)求取消if (token.IsCancellationRequested){Console.WriteLine("任務(wù)已被取消");return;}Console.WriteLine($"正在執(zhí)行任務(wù)... {i}");await Task.Delay(500); // 模擬耗時(shí)操作}Console.WriteLine("任務(wù)完成");}, token);// 給任務(wù)一些時(shí)間運(yùn)行Thread.Sleep(3000);// 請(qǐng)求取消任務(wù)cts.Cancel();// 等待任務(wù)完成task.Wait();}
}
在這個(gè)例子中,我們創(chuàng)建了一個(gè)CancellationTokenSource
實(shí)例,并從中獲取了CancellationToken
。然后我們啟動(dòng)了一個(gè)異步任務(wù),并將CancellationToken
作為參數(shù)傳遞給它。在任務(wù)中,我們使用await Task.Delay
來模擬長(zhǎng)時(shí)間運(yùn)行的操作,并在每次循環(huán)中檢查IsCancellationRequested
屬性,以確定是否已經(jīng)請(qǐng)求了取消。如果cts.Cancel()
被調(diào)用,那么IsCancellationRequested
將變?yōu)?code>true,從而終止任務(wù)的執(zhí)行。
需要注意的是,一旦CancellationTokenSource.Cancel()
被調(diào)用,就不能再次取消相同的任務(wù),除非重新創(chuàng)建一個(gè)新的CancellationTokenSource
實(shí)例。此外,當(dāng)任務(wù)被取消時(shí),它會(huì)拋出一個(gè)TaskCanceledException
,這通常需要在調(diào)用方進(jìn)行處理,或者你可以通過CancellationToken.ThrowIfCancellationRequested()
方法顯式拋出異常。
?
3.CancellationTokenSource 與Thread的啟動(dòng)、取消的區(qū)別??
在C#中,Thread
和CancellationTokenSource
都是用于控制異步操作和線程管理的重要工具,但它們?cè)谠O(shè)計(jì)目的和使用方式上有著本質(zhì)的區(qū)別。下面我將詳細(xì)解釋這兩者之間的區(qū)別,并通過示例來說明。
Thread
Thread
類允許你創(chuàng)建一個(gè)新的線程,在這個(gè)線程上執(zhí)行代碼。這是早期多線程編程的主要方式,但是直接管理線程存在一些問題:
- 資源消耗:每個(gè)線程都有一定的開銷,過多的線程會(huì)消耗大量系統(tǒng)資源。
- 取消操作:直接停止一個(gè)線程是不安全的,因?yàn)榫€程可能處于任何狀態(tài),直接中斷可能會(huì)導(dǎo)致數(shù)據(jù)損壞或資源泄露。
- 同步問題:需要手動(dòng)處理鎖和其他同步機(jī)制以避免競(jìng)態(tài)條件。
CancellationTokenSource
CancellationTokenSource
是.NET Framework 4.0引入的一個(gè)特性,它提供了一種優(yōu)雅地取消長(zhǎng)時(shí)間運(yùn)行操作的方式。它與Task
和async/await
一起使用,而不是直接與Thread
結(jié)合。CancellationTokenSource
的優(yōu)點(diǎn)包括:
- 取消請(qǐng)求:可以向正在運(yùn)行的任務(wù)發(fā)送取消請(qǐng)求,任務(wù)可以選擇響應(yīng)并優(yōu)雅地結(jié)束。
- 資源管理:使用
CancellationTokenSource
通常不會(huì)造成資源過度消耗,因?yàn)樗蕾囉谌蝿?wù)調(diào)度器和異步操作。 - 易于使用:提供了API來檢查取消狀態(tài),無需顯式管理線程。
示例對(duì)比
使用Thread?
using System;
using System.Threading;class Program {static void Main() {Thread thread = new Thread(Run);thread.Start();Console.WriteLine("Press any key to cancel the thread...");Console.ReadKey();thread.Abort(); // 不推薦使用Abort,因?yàn)樗赡茉谌我恻c(diǎn)中斷線程}static void Run() {while (true) {Console.WriteLine("Running...");Thread.Sleep(1000);}}
}
使用CancellationTokenSource
using System;
using System.Threading;
using System.Threading.Tasks;class Program {static async Task Main() {CancellationTokenSource cts = new CancellationTokenSource();CancellationToken token = cts.Token;Task task = Task.Run(async () => await Run(token));Console.WriteLine("Press any key to cancel the task...");Console.ReadKey();cts.Cancel(); // 請(qǐng)求取消await task; // 等待任務(wù)完成或被取消}static async Task Run(CancellationToken token) {while (!token.IsCancellationRequested) {Console.WriteLine("Running...");await Task.Delay(1000, token);}Console.WriteLine("Task cancelled.");}
}
?在上面的示例中,使用CancellationTokenSource
和Task
的方式更安全且更容易管理取消邏輯。
?
?
?