异步编程(二)

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的完成

时间: 2024-07-28 21:26:51

异步编程(二)的相关文章

并发系列64章(异步编程二)第三章

前言 是在第二章基础上续写的,主要是完结第二章例子部分. 请看下面几个例子,感受一下. 报告进度 不管我们完任何app,每次更新的时候都能看到进度条. 而我们知道ui界面更新,一般来说是和更新程序异步的,但是更新程序又要通知ui进度. 代码: public class Program { static double percentComplete = 0; static void Main(string[] args) { doit(); Console.ReadKey(); } public

C# 异步编程Task整理(二)异常捕捉

一.在任务并行库中,如果对任务运行Wait.WaitAny.WaitAll等方法,或者求Result属性,都能捕获到AggregateException异常. 可以将AggregateException异常看做是任务并行库编程中最上层的异常. 在任务中捕获的异常,最终都应该包装到AggregateException中.一个任务并行库异常的简单处理示例如下: static void TestTwo() { Task t1= Task.Factory.StartNew(() => { throw n

Javascript异步编程之二回调函数

上一节讲异步原理的时候基本上把回掉函数也捎带讲了一些,这节主要举几个例子来具体化一下.在开始之前,首先要明白一件事,在javascript里函数可以作为参数进行传递,这里涉及到高阶函数的概念,大家可以自行google一下. 传统的同步函数需要返回一个结果的话都是通过return语句实现,例如: function foo() { var a = 3, b = 2; return a+b; } var c = foo(); console.log(c); //5 就是说后面的代码console.lo

异步编程(二)基于事件的异步编程模式 (EAP)

一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的,既然存在这样的问题,微软当然也应该提供给我们解决问题的方案了,所以微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是我这个专题中介绍的基于事件的异步编程模型--EAP. 实现了基于事件的异步模式的类将

【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的. 二.同步代码存在的问题 对于同步的代码,大家肯定都不陌生,因为我们平常写的代码大部分都是同步的,然而同步代码却存在一个很严重的问题,例如我们向一个Web服务器发出一个

Javascript异步编程的4种方法

转自 阮一峰 http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 作者: 阮一峰 日期: 2012年12月21日 你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境

C#基础___异步编程

C#异步编程_0 三种常见模式:1.async/await    2.Background类    3.BeginInvoke/EndInvoke 一.async/await 代码示例: class Program { static void Main() { Task<int> value = DoAsyncStuff.Handing(5, 6); } } static class DoAsyncStuff { public static async Task<int> Hand

Javascript教程:js异步编程的4种方法详述(转载)

文章收集转载于(阮一峰的网络日志) 你可能知道,Javascript语言的执行环境是“单线程”(single thread). 所谓“单线程”,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方

JavaScript异步编程设计快速响应的网络应用

JavaScript已然成为了多媒体.多任务.多内核网络世界中的一种单线程语言.其利用事件模型处理异步触发任务的行为成就了JavaScript作为开发语言的利器.如何深入理解和掌握JavaScript异步编程变得尤为重要!!!<JavaScript异步编程设计快速响应的网络应用>提供了一些方法和灵感. 一.深入理解JavaScript事件 1. 事件的调度 JavaScript事件处理器在线程空闲之前不会运行(空闲时运行). var start = new Date(); setTimeout