栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

.Net C# Task 任务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.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 action = WriteCon2;
Task t4 = new Task(action, "t4"); 

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

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

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

            Task 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 action = WriteCon2;
            Task t4 = new Task(action, "t4");

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

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

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

            //Run方法带返回值调用 并增加后续处理
            Task 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;
        }

    } 

输出结果:

 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号