c# task threadPool Task.WaitAll async/await

一,task

1,//创建奇数线程池
            ManualResetEvent mreset = new ManualResetEvent(false);
            Task task1 = new Task(e =>
            {
                Os(e);
                mreset.Set();
            }, 10);
            task1.Start();

public static void Os(object e)
        {
            int x = Convert.ToInt32(e);
            for (int i = 1; i <= x; i += 2)
            {
                Console.WriteLine("奇数: " + i);
                Thread.Sleep(500);
            }
        }

   mreset.WaitOne();

// 创建偶数线程池
            ManualResetEvent mreset1 = new ManualResetEvent(false);
            Task task2 = new Task(e =>
            {
                Js(e);
                mreset1.Set();
            }, 10);
            task2.Start();

public static void Js(object e)
        {
            int x = Convert.ToInt32(e);
            for (int i = 2; i <= x; i += 2)
            {
                Console.WriteLine("偶数: " + i);
                Thread.Sleep(500);
            }
        }
   mreset1 .WaitOne();

 // 创建奇数线程池
            ManualResetEvent mreset = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(e =>
            {
                int x = Convert.ToInt32(e);
                for (int i = 1; i <= x; i += 2)
                {
                    Console.WriteLine("奇数: " + i);
                    Thread.Sleep(500);
                }
                mreset.Set();
            }, 10);
            // 创建偶数线程池
            ManualResetEvent mreset1 = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(e =>
            {
                int x = Convert.ToInt32(e);
                for (int i = 2; i <= x; i += 2)
                {
                    Console.WriteLine("偶数: " + i);
                    Thread.Sleep(500);
                }
                mreset1.Set();
            }, 10);
            //等待子线程运行结束
            mreset.WaitOne();
            mreset1.WaitOne();

2,task.Wait();  等待task任务完成之后执行后续 线程代码

等待所有线程执行完毕后再执行主线内容
 Task.WaitAll(task, task2, task3,task4);
等待所有线程中至少有一个执行完毕后再执行主线内容
Task.WaitAny(task, task2, task3, task4);

二,Task.ContinueWith 线程延续

例子1: //如果线程中的结果 需要再后续使用 使用线程延续

Task<int> task4 = new Task<int>(() =>
          {
              Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ":task4");
              return 120;
          });
            task4.Start();
            task4.ContinueWith(e =>
            {
                //获取task4线程ID
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ";ContinueWith");
                //获取task4 完成后的返回值结果
                Console.WriteLine(e.Result);
                int b = 10;
                Console.WriteLine(b + e.Result);
            });
//1.初始化线程取消类
 CancellationTokenSource tokenSource = new CancellationTokenSource();
 //2.获取线程取消标记
 CancellationToken token = tokenSource.Token;

Task.Run(() => {
                for (var i = 0; i < 1000; i++)
                {   
                    Thread.Sleep(1000);
                    Console.WriteLine(i);
                    
                    //是否执行取消方法 如果取消  为true  反之为 false  
                    // tokenSource.Cancel(); 作用就是让token.IsCancellationRequested 为true
                    //token.IsCancellationRequested 默认值为false   
                    if (token.IsCancellationRequested)
                    {   
                        Console.WriteLine("取消请求已发出");
                        //return 才是真正结束线程方式 
                        return;
                    }
                }

            },token);

//取消线程方法
            tokenSource.Cancel();

三,如何通过使用async/await  完成异步编程
1.async 必须修饰方法  被修饰的方法 表示是一个异步方法

 public async static void ProgramMothod1()
        {
            Console.WriteLine("ProgramMothod1开始执行");
            //await写法一
            await ProgramMothod1_1();
            Console.WriteLine("ProgramMothod1结束执行");

        }

 public static Task ProgramMothod1_1()
        {
            Task task = Task.Run(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine(i + "ProgramMothod1");
                }

            });
            return task;
          
        }

2.async 和await必须连用  如果不使用await 那么这个方法还是同步方法
3.async 描述的方法 的返回值类型必须是void 或者是task 或者task<T>
4.await 描述的也是方法 但是必须是使用线程(task)的方法
5.async方法在执行的时候,开始是以同步的方式执行,直到遇到await关键字,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值