Task使用小結


Task是.NET推出數據任務處理的工作類,Task的使用也被越來越多的人講解,這里僅僅介紹Task的部分使用介紹;

1、Task簡單創建

--無返回值

Task.Factory.StartNew(() =>{ Console.WriteLine('Hello World'); });
--返回字符串類型
Task.Factory.StartNew(()
=>{ Console.WriteLine('Hello World'); return 'I'm OK !' });

備注:Task還有Wait方法等待Task任務的完成之后,走下面代碼;

2、Task數據同步控制

之所以說控制,是因為Task執行的時候,我們能夠通過一個公用的參數變量來控制Task任務的進行,之前我們使用的方式是全局定義一個Bool類型的數據,通過判斷該變量值來控制程序的進行;在Task中,我們可以使用CanCellationToken來控制,事例代碼如下:

        static CancellationTokenSource CancellTokenSource = new CancellationTokenSource();
        
        static void MainTask()
        {
            Task.Factory.StartNew(() => {
                while (!CancellTokenSource.IsCancellationRequested)
                {
                    Console.WriteLine("Hello Good");
                }
            }, CancellTokenSource.Token);
            CancellTokenSource.CancelAfter(3000);
        }

當然CanCellationToken也是可以交叉使用,如下面事例代碼:

        static CancellationTokenSource C1 = new CancellationTokenSource();
        static CancellationTokenSource C2 = new CancellationTokenSource();
        static CancellationTokenSource C3 = new CancellationTokenSource();

        static CancellationTokenSource CancellTokenSource = new CancellationTokenSource();
        
        
        static void MainTaskMuilte()
        {
            CancellTokenSource = CancellationTokenSource.CreateLinkedTokenSource(C1.Token, C2.Token, C3.Token);

            Task.Factory.StartNew(() => {
                while (!CancellTokenSource.IsCancellationRequested)
                {
                    Console.WriteLine("Hello Good");
                }
            }, CancellTokenSource.Token);
            C3.CancelAfter(3000);//只要有一個CanCellationToken停掉,該語句就結束
        }

3、Task的WhenAny和WhenAll方法介紹:

WhenAny表示任意一個Task完成之后,返回這個Task對象,但是有時候我們需要等待任務的完成,比如競賽,只有有一個人完成,WhenAny就會返回這個人內容(有點不太切合實際),WhenAll表示處理完成之后,返回所有對象實例,代碼如下:

        public async void OpeartTask()
        {
           
            List<Task<string>> TaskList = new List<Task<string>>() {
                Task.Factory.StartNew(()=> { return WriteHello(10); },C1.Token),
                Task.Factory.StartNew(()=> { return WriteHello(20); },C1.Token),
                Task.Factory.StartNew(()=> { return WriteHello(30); },C1.Token),
                Task.Factory.StartNew(()=> { return WriteHello(40); },C1.Token)
            };
            //var Reuslt= await Task.WhenAll(TaskList);
            var Reuslt = await Task.WhenAny(TaskList);
            if (Reuslt.IsCompleted)
            {
                Console.WriteLine("I'm "+Reuslt.Result+" OK,Other Must Stop");
                C1.Cancel();
            }
}    

備注:等待的時候,要加上async 和 await;

 4、Task.AwaitAll等待所有Task執行完成,該操作是同步完成;


免責聲明!

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



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