C# 高级特性(十):多线程

本文介绍了如何使用Thread和Task在C#中实现多线程,包括不带参数、带参数以及匿名方法的方式,并展示了Task的使用,包括单独启动、并行执行和异步等待。最后,通过async/await关键字展示了异步编程的简洁方式,实现了在等待任务执行的同时允许主线程继续工作。
摘要由CSDN通过智能技术生成

用 Thread实现多线程:

        // 1 不带传入参数的
        public void ThreadFun()
        {
            // 处理后台,例如等待网络响应或耗时长的计算任务
            Console.WriteLine("Thrad:start do something");
            Thread.Sleep(2000);
            Console.WriteLine("Thrad:end ");
        }

        public void MainFun()
        {
            Thread thread = new Thread(ThreadFun);
            thread.Start();
            // 这时主线程还可以做其它事,例如响应用户的取消操作
            Console.WriteLine("Main:Need to wait");
        }

        // 2 使用带参数的
        private void ThreadFun2(object o)
        {
            string name = o as string;  //类型转换
            Console.WriteLine(name + ":Thrad:start do something");
            Thread.Sleep(2000);
            Console.WriteLine(name + ":Thrad:end ");
        }
        public void MainFun2()
        {
            Thread thread = new Thread(ThreadFun2);
            thread.Start("Mark");
            // 这时主线程还可以做其它事,例如响应用户的取消操作
            Console.WriteLine("Main:Need to wait");
        }

        // 3 使用匿名方法
        public void MainFun3()
        {
            Thread thread = new Thread(() => {
                Console.WriteLine("Thrad:start do something");
                Thread.Sleep(2000);
                Console.WriteLine("Thrad:end ");
            });
            thread.Start();
            // 这时主线程还可以做其它事,例如响应用户的取消操作
            Console.WriteLine("Main:Need to wait");
        }

使用Task 实现多线程

// 4 Task 
        public void MainFun4()
        {
            // 1) 
            string name = "Mark";
            Task task = new Task(() => {
                Console.WriteLine(name + " Task:start do something");
                Thread.Sleep(2000);
                Console.WriteLine(name + " Task:end ");
            });
            task.Start();

            // 2)
            Task.Run(() =>
            {
                Console.WriteLine(name + " Task:start do something");
                Thread.Sleep(2000);
                Console.WriteLine(name + " Task:end ");
            });
            // 这时主线程还可以做其它事,例如响应用户的取消操作
            Console.WriteLine("Main:Need to wait");
        }

        // 5 Task
        public void MainFun5()
        {
            Task[] taskList = new Task[2];

            string name = "Mark";
            taskList[0] = Task.Run(() => {
                Console.WriteLine(name+ " Task:start do something");
                Thread.Sleep(2000);
                Console.WriteLine(name + " Task:end ");
            });

            taskList[1] = Task.Run(() => {
                Console.WriteLine(name + " Task:start do something");
                Thread.Sleep(5000);
                Console.WriteLine(name + " Task:end ");
            });

            //  等待多个子线程完成后再继续:
            Task.WaitAll(taskList);
        }

        //async/await的实现:
        public  void MainFun6()
        {
            var ret1 = AsyncGetsum();
            Console.WriteLine("主线程执行其他处理");
            for (int i = 1; i <= 3; i++)
                Console.WriteLine("Call Main()");
            int result = ret1.Result;                  //阻塞主线程
            Console.WriteLine("任务执行结果:{0}", result);
        }

        async Task<int> AsyncGetsum()
        {
            await Task.Delay(1);
            int sum = 0;
            Console.WriteLine("使用Task执行异步操作.");
            for (int i = 0; i < 100; i++)
            {
                sum += i;
            }
            return sum;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值