C# Task阻塞方式和延续操作

Task启动的几种方式

		   var task = new Task(() =>
            {
                Console.WriteLine("工作线程" + Thread.CurrentThread.ManagedThreadId);
            });
            task.Start();
            //工厂
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine("工作线程" + Thread.CurrentThread.ManagedThreadId);
            });

            Task.Run(() =>
            {
                Console.WriteLine("工作线程" + Thread.CurrentThread.ManagedThreadId);
            });


            //同步的方式
            task = new Task(() =>
            {
                Console.WriteLine("工作线程" + Thread.CurrentThread.ManagedThreadId);
            });
            //阻塞执行
            task.RunSynchronously();

Task阻塞方式和延续操作

下面开启2个线程

 Task task = new Task(() =>
            {
                Thread.Sleep(500);
                Console.WriteLine("工作线程1 " + DateTime.Now.ToString());
            });
            task.Start();
            Task task1 = new Task(() =>
            {
                Console.WriteLine("工作线程2 " + DateTime.Now.ToString());
            });
            task1.Start();

WaitAll


            //需要等待所有线程执行完毕,才会继续执行主线程
            Task.WaitAll(task, task1 );
            Console.WriteLine("主线程" + Thread.CurrentThread.ManagedThreadId);
            Console.ReadLine();

WaitAny

           //只要有一个Task执行完毕,就算完成,继续走主线程
            Task.WaitAny(task, task1);
            Console.WriteLine("主线程" + Thread.CurrentThread.ManagedThreadId);
            Console.ReadLine();

ContinueWith 不阻塞主线程,等两个线程执行完毕之后,执行延续任务


            //WhenAll 将task和task1执行完毕之后,在执行延续任务ContinueWith
            Task.WhenAll(task, task1).ContinueWith(t =>
            {
                Console.WriteLine("延续任务");
            });
            //WhenAll 执行完一个线程之后就开始执行延续任务
            Task.WhenAny(task, task1).ContinueWith(t =>
            {
                Console.WriteLine("延续任务");
            });
            Console.WriteLine("主线程" + Thread.CurrentThread.ManagedThreadId);
            Console.ReadLine();

Task工厂中的延续操作

           Task.Factory.ContinueWhenAll(new Task[2] { task, task1 }, (t) =>
            {
                Console.WriteLine("延续任务");
            });
           Task.Factory.ContinueWhenAny(new Task[2] { task, task1 }, (t) =>
            {
                Console.WriteLine("延续任务");
            });
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,`Task`和`Thread`都可以用来实现多线程编程,但它们的实现方式和使用场景略有不同。 `Thread`是C#中最基本的多线程实现方式。它直接操作操作系统的线程,并且需要手动管理线程的生命周期(创建、启动、停止等)。以下是一个使用`Thread`创建和启动线程的简单示例: ``` using System; using System.Threading; class Program { static void Main(string[] args) { Thread thread = new Thread(new ThreadStart(DoWork)); thread.Start(); Console.WriteLine("Main thread is running..."); } static void DoWork() { Console.WriteLine("Worker thread is running..."); } } ``` 在这个示例中,我们使用`Thread`创建了一个新的线程,并启动了该线程。在`Main`方法中,我们创建了一个`Thread`对象,将其构造函数的参数设置为一个方法(即`DoWork`方法),然后使用`Start`方法启动该线程。在`DoWork`方法中,我们输出了一条消息,表示该线程正在运行。 `Task`是.NET 4.0引入的新特性,它提供了一种更高级别的多线程实现方式。`Task`是基于线程池的,它自动管理线程的生命周期,从而使多线程编程变得更加容易。以下是一个使用`Task`创建和启动任务的简单示例: ``` using System; using System.Threading.Tasks; class Program { static void Main(string[] args) { Task task = Task.Run(() => DoWork()); Console.WriteLine("Main thread is running..."); } static void DoWork() { Console.WriteLine("Worker thread is running..."); } } ``` 在这个示例中,我们使用`Task.Run`创建了一个新的任务,并启动了该任务。在`Main`方法中,我们创建了一个`Task`对象,将其构造函数的参数设置为一个方法(即`DoWork`方法),然后使用`Run`方法启动该任务。在`DoWork`方法中,我们输出了一条消息,表示该任务正在运行。 总的来说,如果你只需要简单地创建和启动线程,那么使用`Thread`就足够了。但如果你需要更高级别的多线程功能,例如异步编程或任务的取消和等待,那么使用`Task`更加方便和灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值