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
    评论
C#中的async/await是用于处理异步操作的关键字。它们可以帮助开发者更方便地编写和管理异步代码。 首先,我们需要将带有异步操作的方法标记为async,这告诉编译器该方法包含异步代码。然后,我们可以使用await关键字来等待一个异步操作成。 当遇到await关键字时,程序会暂停执行并等待异步操作成。在等待期间,控制权会返回给调用者,这样可以避免阻塞线程。一旦异步操作成,程序会继续执行await后面的代码。 使用async/await可以使异步代码更加易读和易于维护。它们能够简化回调函数和处理异步任务的代码。此外,它们还可以帮助我们处理异常,使得错误处理更加简单。 以下是一个示例,演示了如何使用async/await来调用一个异步方法: ```csharp async Task<string> DownloadDataAsync(string url) { HttpClient client = new HttpClient(); string data = await client.GetStringAsync(url); return data; } async Task Main() { string url = "https://example.com"; string result = await DownloadDataAsync(url); Console.WriteLine(result); } ``` 在上面的示例中,DownloadDataAsync方法使用await关键字等待HttpClient的GetStringAsync方法成。然后,它将获取的数据作为字符串返回。 在Main方法中,我们通过await关键字等待DownloadDataAsync方法成,并将结果打印到控制台。 这就是使用async/await处理异步操作的基本概念。希望能对你有所帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值