C#多线程示例(Thread/Task/Async/Await/) 看完秒懂

Thread

  • Thread为C#提供的基础线程类,初始化函数为public Thread(ThreadStart start),其中ThreadStart为委托类型,在实际使用过程中,通常通过Lambda函数实现。
- `namespace demo02
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始测试");
            Console.WriteLine("主线程休眠3秒");
            threadFunc();
            Thread.Sleep(3000);
            Console.WriteLine("主线程休眠结束");
        }
        // Thread函数
        static void threadFunc() {
        	// 开辟新线程
            Thread t = new Thread(()=>
            {
                Console.WriteLine("Thread线程函数开始运行");
                Thread.Sleep(2000);
                Console.WriteLine("Thread线程函数运行结束,用时2秒");
            }
            );
            t.Start();
        }
	}	
}

Task(推荐)

  • 在多线程开发过程中,推荐使用Task类型;
  • Task底层通过Thread实现,但是Task在Thread的基础上,提供了线程管理功能,如线程池,并且在处理高并发问题时的性能更好;
namespace demo02
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始测试");
            Console.WriteLine("主线程休眠3秒");
            taskFunc();
            Thread.Sleep(3000);
            Console.WriteLine("主线程休眠结束");
        }
        // Task函数(推荐)
        static void taskFunc() {
            Task.Run(() =>
            {
                Console.WriteLine("Task线程1开始运行");
                Thread.Sleep(2000);
                Console.WriteLine("Task线程1运行结束,用时2秒");
            });
            // 所有Task线程并列同时运行
            Task.Run(() =>
            {
                Console.WriteLine("Task线程2开始运行");
                Thread.Sleep(2000);
                Console.WriteLine("Task线程2运行结束,用时2秒");
            });
        }
    }
}

Async异步方法

  • 通过将函数标注为异步方法,并未Task线程添加await标签,可以确保该线程执行完毕后,再执行后续代码。
namespace demo02
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始测试");
            Console.WriteLine("主线程休眠3秒");
            asyncTaskFunc();
            Thread.Sleep(3000);
            Console.WriteLine("主线程休眠结束");
        }
         // 申明为async异步方法
        static async void asyncTaskFunc() {
            // 添加await,使该线程完成后再运行后续代码
            await Task.Run(() =>
            {
                Console.WriteLine("Task线程开始运行");
                Thread.Sleep(2000);
                Console.WriteLine("Task线程运行结束,用时2秒");
            });
            Console.WriteLine("AsyncTaskFunc函数运行完毕");
        }
	}
}        

线程池

  • 通过将Task对象添加入List<Task>队列,可对队列中的线程进行统一管理。
namespace demo02
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始测试");
            Console.WriteLine("主线程休眠3秒");
            listAsyncTaskFunc();
            Thread.Sleep(3000);
            Console.WriteLine("主线程休眠结束");
        }
        static void listAsyncTaskFunc() {
            // 创建线程列表
            List<Task> ts = new List<Task>();
            ts.Add(Task.Run(() =>
            {
                Console.WriteLine("Task线程1开始运行");
                Thread.Sleep(2000);
                Console.WriteLine("Task线程1运行结束,用时2秒");
            }));
            ts.Add(Task.Run(() =>
            {
                Console.WriteLine("Task线程2开始运行");
                Thread.Sleep(2000);
                Console.WriteLine("Task线程2运行结束,用时2秒");
            }));
            // 等待列表中的所有线程都运行完毕后,
            // 运行后续代码
            Task.WhenAll(ts).ContinueWith(t =>
            {
                Console.WriteLine("异步线程列表已运行结束");
            });
        }
	}
}        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值