.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");

            //等待t1\t2\t3任务执行完毕
            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;
        }

    } 
  

输出结果:

.Net C# Task 任务_第1张图片

 

你可能感兴趣的:(.Net,C#,.net,c#,asynctask,多线程,并行计算)