.Net C# Task 任务

Task可以用来并行处理多个任务,使用线程池线程进行异步处理,配合 await async 可以非常好的完成异步任务,使用Task 可以很方便的利用线程池中的线程,比Thread 好用很多。

创建一个Task任务;

1.Run方法调用:

Task t1 = Task.Run(WriteCon);

2.StartNew方法调用:

Task t2 = Task.Factory.StartNew(WriteCon1);

3.Run方法传参调用:

Task t3 = Task.Run(() => WriteCon2("t3"));

4.委托形式任务调用:

Action<object> action = WriteCon2;
Task t4 = new Task(action, "t4");

5.Run方法带返回值调用:

Task<string> t5 = Task.Run(() => WriteCon3("123"));

在多个任务运行时,因为Task任务不使用await时并不等待调用线程(异步),所以我们可以使用Wait() 方法等待任务完成。

            Task<string> t5 = Task.Run(() => WriteCon3("123"));
            //等待t5任务执行完毕,然后在通过Result属性获取返回结果,避免死锁及同步等待。
            t5.Wait();
            string retStr = t5.Result;

也可以使用WaitAll() 等待多个任务执行完毕:

Task.WaitAll(t1, t2, t3);

注意:Wait和WaitAll 会阻塞调用线程,在异步方法中推荐使用 WhenAll 进行异步等待,释放调用线程。

await Task.WhenAll(t1, t2, t3);

完整参考代码:

   class TaskDemo
    {
        public static void TaskDemoMain()
        {
            //Run方法调用
            Task t1 = Task.Run(WriteCon);

            //StartNew方法调用
            Task t2 = Task.Factory.StartNew(WriteCon1);

            //Run方法传参调用
            Task t3 = Task.Run(() => WriteCon2("t3"));

            //委托形式任务调用
            Action<object> action = WriteCon2;
            Task t4 = new Task(action, "t4");

            //等待t1\t2\t3任务执行完毕
            Task.WaitAll(t1, t2, t3);

            t4.Start();//等待前面任务完成后t4任务启动

            //Run方法带返回值调用
            Task<string> t5 = Task.Run(() => WriteCon3("123"));
            //等待t5任务执行完毕,然后在通过Result属性获取返回结果,避免死锁及同步等待。
            t5.Wait();
            string retStr = t5.Result;
            Console.WriteLine(retStr);

            //Run方法带返回值调用 并增加后续处理
            Task<string> t6 = Task.Run(() => WriteCon3("123"))
                .ContinueWith(t =>
                {
                    string temp = t.Result;
                    return temp + "---这是t6任务";
                });
            //等待t5任务执行完毕,然后在通过Result属性获取返回结果,避免死锁及同步等待。
            t6.Wait();
            string retStr1 = t6.Result;
            Console.WriteLine(retStr1);
        }

        private static void WriteCon()
        {
            Thread.Sleep(2000);
            Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon方法完成");
        }

        private static void WriteCon1()
        {
            Thread.Sleep(1000);
            Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon1方法完成");
        }

        private static void WriteCon2(object msg)
        {
            Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon2方法完成,输出:" + msg);
        }

        private static string WriteCon3(string msg)
        {
            Console.WriteLine($"Task-{Task.CurrentId},线程-{Thread.CurrentThread.ManagedThreadId},WriteCon3方法完成,输出:" + msg);
            return "WriteCon3方法完成,输出:" + msg;
        }

    }

输出结果:

 

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个堆栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值