C#异步编程之浅谈Task

上一篇讲到了.Net4.5新增的async和await关键字,其实async和await算是一组标记,真正实现异步操作的是Task新开的任务线程。

什么是Task

Task是.Net4.0新增用来处理异步编程的,叫做基于“任务编程模型”,任务其实是架构在线程之上的,具体操作的时候还是由线程去执行的,任务的管控有点类似于线程池,程序中开10个Task,不一定对应的要开10个线程,他们并不是一一对应的关系。

  1. 创建Task
    创建Task有两种方式,一种是直接实例化,另一种是使用任务工厂生成。
Task<int> ts = new Task<int>(TaskTest, 100);

public static int TaskTest(object state)
        {
            int data = (int)state;
            int sum = 0;
            for (int i = 0; i < data; i++)
            {
                sum++;
            }
            return sum;
        }

这里第一个参数为方法委托,可以直接传入要执行的方法名,值得注意的是这个方法的参数类型为object,若改为int,会编译不过,具体可去查看Task的构造函数的参数类型。
当然也可以用Lamda表达式

Task<int> ts = new Task<int>((state) =>
            {
                int data = (int)state;
                int sum = 0;
                for (int i = 0; i < data; i++)
                {
                    sum++;
                }
                return sum;
            },10);
            ts.Start();

实例化的Task对象,必须用Start方法启动。
第二种用任务工厂直接创建的无需用Start方法启动执行,创建后就会执行

 Task<int> task = Task.Factory.StartNew<int>(
                (state) =>
                {
                    int data = (int)state;
                    int sum = 0;
                    for (int i = 0; i < data; i++)
                    {
                        sum++;
                    }
                    return sum;
                }, 10);

Task与Task的区别是,Task是没有返回值的,而Task是有返回值的,且返回值类型为T,对于没有返回值的Task,可用Wait方法等待其执行完成,有返回值得直接用task.Result即可,记住,在等待任务执行完的过程中,是会阻塞主线程的,这也就是async和await的的作用体现了。
若有多个任务,比如任务1和任务2,且任务2要在任务1执行完毕后立刻启动执行,下面就来介绍Task.ContinueWith

static void Main(string[] args)
        {
            Task<int> ts1 = new Task<int>(() => {
                return 100;
            });
            ts1.Start();
            var re = ts1.ContinueWith<int>((task) => {
                return task.Result + 200;
            });
            Console.WriteLine("执行结果:"+re.Result);
            Console.ReadLine();
        }

这里写图片描述
ContinueWith 需将ts1作为参数进行传递,即总可以把前面的一个Task用ContinueWith传递给下一个要执行的Task,下面是任务工厂的写法

Task.Factory.StartNew<int>(() => { return 100; }).ContinueWith<int>(ts =>
            {
                return ts.Result + 200;

            }).ContinueWith(task => {
                Console.WriteLine("执行结果:" + task.Result);
            });
            Console.ReadLine();

Mark下

Async和Await是C#中用于实现异步编程的关键字。Async用于指示该方法是一个异步方法,而Await用于等待异步操作完成。通过使用Async和Await,我们可以在调用异步方法时,不必阻塞当前线程,而是继续执行后续的代码。 使用Async和Await可以简化异步编程的复杂性,使代码更加清晰和易于理解。当我们使用Async和Await时,编译器会生成状态机来处理异步操作的执行和回调。 引用中提到了C#中使用Async和Await的相关内容,可以详细了解这两个关键字的使用方法和原理。 另外,引用提到了在使用循环时,如果想要达到同步效果,应该使用for循环而不是forEach。这是因为forEach不支持通过改写为Async/Await函数来实现同步操作。 总而言之,Async和Await是C#中用于实现异步编程的关键字,可以帮助我们编写更加高效和清晰的异步代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浅谈C#中的Async和Await的用法详解](https://download.csdn.net/download/weixin_38551070/13993108)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Javascript中sync、async和await、Promise的理解使用](https://blog.csdn.net/D_lunar/article/details/112215030)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值