c# Task用法

本文详细介绍了C#中Task的使用,包括无返回值的Task应用、有返回值的Task实现、ContinueWith的使用场景,以及如何结合Async和await进行非阻塞操作。还探讨了Task的回调功能,通过实例展示了无参数和带参数的方法应用。

1. 无返回值
方法1

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start:" + DateTime.Now);
            Task task = new Task(() => Test());
            task.Start();
            Task task1 = new Task(() => Test1());
            task1.Start();

            Console.ReadKey();
        }

        public static void Test()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Test:" + DateTime.Now);
        }
        public static void Test1()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Test1:" + DateTime.Now);
        }
    }

运行结果
运行结果
———————————————————————————————————————
方法2

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start:" + DateTime.Now);
            Task.Run(() => Test());

            Task.Run(() => {
                Test1();
            });
            Console.ReadKey();
        }

        public static void Test()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Test:" + DateTime.Now);
        }
        public static void Test1()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Test1:" + DateTime.Now);
        }
    }

运行结果
在这里插入图片描述
———————————————————————————————————————
方式3

   class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start:" + DateTime.Now);
            Task.Factory.StartNew(() => Test());

            Task.Factory.StartNew(() =>
            {
                Test1();
            });
            Console.ReadKey();
        }

        public static void Test()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Test:" + DateTime.Now);
        }
        public static void Test1()
        {
            Thread.Sleep(2000);
            Console.WriteLine("Test1:" + DateTime.Now);
        }
    }

运行结果
在这里插入图片描述
2. 有返回值用法
方法1

    class Program
    {
        static void Main(string[] args)
        {
            Task<string> task = Task.Run(() => {

                return "12345";
            });
            
			task.Wait();
            Console.WriteLine(task.Result);
            Console.ReadLine();
        }
    }

运行结果
在这里插入图片描述

方法2

 class Program
    {
        static void Main(string[] args)
        {
            int n = Test2().Result;
            Console.WriteLine(n);

            Console.ReadKey();
        }

        public static async Task<int> Test()
        {
            return await Test2();
        }

        public static async Task<int> Test2()
        {
            var s = await Task.FromResult<int>(1234);
            return s;
        }
    }

运行结果
在这里插入图片描述

3.ContinueWith 在某Task之后执行

   class Program
    {
        static void Main(string[] args)
        {
            Task<string> task1 = Task<string>.Run(() =>
            {
                Task.Delay(10);
                Console.WriteLine("This is task1");
                return "This is task1 return";
            });

            Task task2 = Task.Run(() =>
            {
                Console.WriteLine("This is task2");
            });

            //Task task2 = task1.ContinueWith((t) =>
            //{
            //    Console.WriteLine("This is task2");
            //    Console.WriteLine(t.Result);
            //});

            task1.Wait();
            task2.Wait();
            Console.ReadKey();
        }

    }

运行结果
不使用ContinueWith
在这里插入图片描述
使用ContinueWith
在这里插入图片描述
4. Task与 Async 和 await,如某方法内需要执行耗时操作并需要返回值,但不希望阻塞

    class Program
    {
        static void Main(string[] args)
        {
            Task<int> sum = Test();

            Console.WriteLine("Run complete!" + sum.Result);
            Console.ReadKey();
        }

        private static async Task<int> Test()
        {
            int sum = await Task<int>.Run(() =>
            {
                return Cal();
            });

            return sum;
        }

        public static int Cal()
        {
            int sum = 0;
            for (int i = 0; i < 1000; i++)
            {
                sum = sum + i;
                Thread.Sleep(1);
            }
            return sum;
        }

    }

运行结果
在这里插入图片描述
5. Task回调

  1. 方法1,无参数
    class Program
    {
        static void Main(string[] args)
        {
            Action a = new Action(() =>
            {
                Console.WriteLine("Action ");
            });
            Task.Factory.FromAsync(a.BeginInvoke(CallBack, null), a.EndInvoke);

            Console.ReadKey();
        }

        private static void CallBack(IAsyncResult ar)
        {
            Console.WriteLine("CallBack ");
        }
    }

运行结果
在这里插入图片描述
方法2,有参数

        static void Main(string[] args)
        {
            Action<string> a = new Action<string>((ss) => {
                Console.WriteLine("Action " + ss);
            });
            Task.Factory.FromAsync(a.BeginInvoke("1234",CallBack, "5678"), a.EndInvoke);

            Console.ReadKey();
        }

        private static void CallBack(IAsyncResult ar)
        {
            Console.WriteLine("CallBack " + ar.AsyncState);
        }
    }

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值