zoukankan      html  css  js  c++  java
  • Task多线程

    Task多线程

     1.首先是我们线程之间的启动。

     1.这样

        Task task = new Task(()=>
                {
                    //
                    System.Threading.Thread.Sleep(500);
                    Console.WriteLine("do something....");
                    //匿名函数,
                    //还要其他的一些东邪;
                });
                task.Start();

    2.或则这样

     Task t=Task.Run(()=> { Console.WriteLine("直接我就开始run了..."); });

    3.再或则这样

      static void DoSomething()
            {
                System.Threading.Thread.Sleep(500);
                Console.WriteLine("do something..static");
    
            }
            static void Main(string[] args)
            {
                Task t1 = new Task(DoSomething);
                t1.Start(); //这样我们就启动的落地呀;
    
                
                Console.WriteLine("I am main thread line");
                Console.ReadLine();
            }

    4.这样

      Task task = Task.Factory.StartNew(() => { Console.WriteLine("这样,直接使用的Task.Factory.StartNew"); });
      TaskFactory tf = new TaskFactory();
      Task t1 = tf.StartNew(() => { Console.WriteLine("再或则这样..."); });

    总结:大概就是两种方式;构造函数和我们的factory;

    1.等待任务的完成并获取返回值,这个就是我们简单的基本操作;

                Task<int> task = new Task<int>(() => {
                    int sum = 0;
                    Console.WriteLine("fucking life...");
                    for (int i = 0; i < 100; i++)
                    {
                        sum += i;
                    }
                    return sum;
                });
                task.Start();
                task.Wait();
                var result = task.Result.ToString();
                Console.WriteLine("result is "+task.Result.ToString());
                Console.WriteLine("I am main thread line");
                Console.ReadLine();

    2.ContinueWith方法在任务完成时启动一个新任务

     Task<int> task = new Task<int>(() => {
                    System.Threading.Thread.Sleep(600);
                    int sum = 0;
                    Console.WriteLine("fucking life...");
                    for (int i = 0; i < 100; i++)
                    {
                        sum += i;
                    }
                    return sum;
                });
                task.Start();
                Console.WriteLine("主线程,执行其他任务...");
                
                Task hoop=task.ContinueWith(t=>{
                    Console.WriteLine("任务执行完之后的结果是:{0}",t.Result.ToString());
                });
    
                Console.WriteLine("I am main thread line");
                Console.ReadLine();

    Task 的生命周期;

                var task1 = new Task(() =>
                  {
                      Console.WriteLine("begin");
                      System.Threading.Thread.Sleep(2000);
                      Console.WriteLine("finish");
    
                  });
                Console.WriteLine("before start:"+task1.Status);
                task1.Start();
                Console.WriteLine("after start:"+task1.Status);
                task1.Wait();  //用来主阻塞线程,
                Console.WriteLine("after finissh:"+task1.Status);

    从我们可以得出Task的简略生命周期:

    Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。

    WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。

    RanToCompletion:任务执行完毕。

    Task 流程的控制

     var task1 = new Task(() =>
                  {
                      Console.WriteLine("task 1 begin");
                      System.Threading.Thread.Sleep(2000);
                      Console.WriteLine("task 1 finished");
                  });
    
                var task2 = new Task(() =>
                {
                    Console.WriteLine("task 2 begin");
                    System.Threading.Thread.Sleep(2000);
                    Console.WriteLine("task 2 finished");
                });
    
    
                var task3 = new Task(() =>
                {
                    Console.WriteLine("task 3 begin");
                    System.Threading.Thread.Sleep(2000);
                    Console.WriteLine("task 3 finished");
                });
    
                task1.Start();
                task2.Start();
                task3.Start();
    
                Task.WaitAll(task1, task2, task3);  //他它接受数组类型的task的使用地呀;
                Console.WriteLine("All task has finished");
    
    
                Console.ReadLine();

     Ps: Task.WaitAny

    这个用发同Task.WaitAll,就是等待任何一个任务完成就继续向下执行,将上面的代码WaitAll替换为WaitAny,输出结果如下:

     ContinueWith的用法。

                var task1 = new Task(() =>
                  {
                      Console.WriteLine("task 1 begin");
                      System.Threading.Thread.Sleep(500);
                      Console.WriteLine("task 1 finished");
                  });
    
    
                task1.Start();
                var result = task1.ContinueWith<string>(t=> {
    
                    Console.WriteLine("task1 finished ");
                    return "continue task finish.....";
                });
    //在每次调用ContinueWith方法时,每次会把上次Task的引用传入进来,以便检测上次Task的状态,
                var send = Task.Factory.StartNew(() => { Console.WriteLine("fuck life.."); })
                    .ContinueWith<bool>(s => { if (1 == 1) return false; })
                    .ContinueWith<string>(r =>
                    {
                        if (r.Result)
                        {
                            return "Finished";  //可以获取上一个流程task 中的值
                        }
                        else
                        {
                            return "Error";
                        }
    
                    });
                Console.WriteLine(send.Result);
    
                

    Task的取消

        

    var tokenSource = new CancellationTokenSource();
                var token = tokenSource.Token;
                Console.WriteLine(token.ToString());
    
                var task = Task.Factory.StartNew(() =>
                  {
                      for (var i = 0; i < 1000; i++)
                      {
                          System.Threading.Thread.Sleep(1000);
                          Console.WriteLine("proceeed mission...");
                          if (token.IsCancellationRequested)
                          {
                              Console.WriteLine("Abort mssion sucess!");
                              //这里也采用轮循的方式....
                              return;
                          }
                      }
    
                  },token);
    
                token.Register(() =>
                {
                    Console.WriteLine("Cancle task....");
                });
    
                Console.WriteLine("press enter to cancle task...");
                Console.ReadKey();
                tokenSource.Cancel();
    
                Console.ReadLine();

     这里还有一篇较好的文章:http://www.cnblogs.com/jesse2013/p/async-and-await.html

  • 相关阅读:
    简单区间dp
    【题解】石子合并
    【2019.7.6】刷题记录
    【题解】大朋友的数字
    【基础】dp系列1
    【题解】垃圾陷阱
    【题解】导弹拦截
    hadoop各组件安装(非专业人士,不定期更新)
    python逼格提升
    python第三十二天-----算法
  • 原文地址:https://www.cnblogs.com/mc67/p/5897864.html
Copyright © 2011-2022 走看看