1. 程式人生 > >異步編程(二)

異步編程(二)

none 調用 cto 編程 one eight 成就 否則 nbsp

3.TAP 基於任務的異步編程

1..NET4.0 引入了Task任務,Task的使用

Task task = new Task(()=> {
                for (int i = 0; i < 1000; i++)
                {
                    Console.WriteLine("task run");
                }               
            });
            task.Start();

這是簡單的啟動任務:下面是task的一些版本

public
Task(Action action); public Task(Action action, CancellationToken cancellationToken); public Task(Action action, TaskCreationOptions creationOptions); public Task(Action<object> action, object state); public Task(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions);
public Task(Action<object> action, object state, CancellationToken cancellationToken); public Task(Action<object> action, object state, TaskCreationOptions creationOptions); public Task(Action<object> action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions);


2.建立一個帶取消功能的Task

CancellationTokenSource tokenSource = new CancellationTokenSource();
Task task = new Task(() => {
                for (int i = 0; i < 1000000; i++)
                {
                    Console.WriteLine("task run");
                }

            }, tokenSource.Token);
           task.Start();

這裏使用Task的task 將會觀察CancellationToken,當調用

tokenSource.Cancel() 即可終止任務

3.使用TaskFactory來創建任務

Task.Factory.StartNew(() => {
                Console.WriteLine("task is running");
            });

4.任務的管理

1.WaitAny

var task1= Task.Factory.StartNew(() => {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine("task1 is running");
                }                
            });

            var task2= Task.Factory.StartNew(() => {
                Console.WriteLine("task2 is running");
            });

            var taskid= Task.WaitAny(task1, task2);
            Console.WriteLine(taskid);

Task.WaitAny(task1, task2) 返回的是完成任務的id,表示只要有一個任務完成就返回完成任務的Id 否則一直阻塞;

2.WaitAll

var task1= Task.Factory.StartNew(() => {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine("task1 is running");
                }                
            });

            var task2= Task.Factory.StartNew(() => {
                Console.WriteLine("task2 is running");
            });

            Task.WaitAll(task1, task2);
            Console.WriteLine("All Task Completed");

技術分享

WaitAll 將等待所有任務的完成,否則將一直阻塞;

3.ContinueWith

這個最有意思,在傳統的同步編程模式下,我們喜歡程序串行執行,然後得到結果,但是在多線程編程中,任務都是並發的,很難再使用同步的方法來編程多線程,但是Task提供了這個ContinueWith,當異步任務完成的時候,接著執行這個ContinueWith,任務執行有返回結果,則使用相應版本的ContinueWith來執行,然後整體的執行就想同步編程那樣,很方便;

var task1= Task.Factory.StartNew(() => {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine("task1 is running");
                }                
            });
            task1.ContinueWith((ta)=> {
                Console.WriteLine("task1 continuewith");
            });

技術分享

帶返回值版本:

var task1= Task.Factory.StartNew(() => {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine("task1 is running");
                }

                return "Hello,world";
            });
            task1.ContinueWith((ta)=> {
                Console.WriteLine("task1 continuewith reulst"+ta.Result);
            });

技術分享

4.任務的阻塞

var task1= Task.Factory.StartNew(() => {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine("task1 is running");
                }

                return "Hello,world";
            });
            task1.Wait();
            Console.WriteLine("task1 completed");

技術分享

waite 將阻塞線程,知道task的完成

異步編程(二)