C#--Task知识点

5天玩转C#并行和多线程编程
TASK使用总结

Task是什么,字面意思是任务

表示一个异步操作。它是异步操作的首选方式。Task是FRAMEWORK4中的新特性,封装了以前的Thread,并管理Thread。

任务和线程的区别:
  1. 任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。
  2. 任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。

关于task的一个前台线程特点

不管从工作函数是否有返回值,task都需要在其运行过程中至少有一个前台线程在跑,否则会直接退出,根本原因是所有task管理其他的都是后台线程。有点不好理解,直接记住,task需要一个前台线程运行就行了。
task对于有返回值的工作函数可以通过访问其Result函数来实现阻塞等待。

生命周期

Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。
WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。 //所以在start的时候,是没有开始执行的,在wait之后才开始执行
RanToCompletion:任务执行完毕。

Task.start,TaskFactory.StartNew,Task.RUn

Task.Run Task.Run则是等线程池空闲后在执行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            Task t1 = new Task(speak);
            t1.Start();
            t1.Wait();
            //使用Task.Factory.StartNew创建任务
            Task t2 = Task.Factory.StartNew(speak);
            //wait函数意味着
            //t2.Wait();
            //使用new的方法创建任务
            Task t3 = new Task(speak);
            t3.Start();
            //t3.Wait();
            //也可以这样,让两个任务同时执行
            Task.WaitAll(t2, t3);
            Task.Run(() => Console.WriteLine("您的数值已经被提交了"));
            Console.ReadKey();
        }
        static void speak()
        {
            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine(i + "的时间是" + DateTime.Now + "线程的id是" + Thread.CurrentThread.ManagedThreadId);
            }
            Thread.Sleep(2000);

        }
    }
}

Task.Wait,Task.Wait,Task.WaitAny不写了

Task.ContinueWith

static void Main(string[] args)
    {
      var task1 = new Task(() =>
      {
        Console.WriteLine("Task 1 Begin");
        System.Threading.Thread.Sleep(2000);
        Console.WriteLine("Task 1 Finish");
      });
      var task2 = new Task(() =>
      {
        Console.WriteLine("Task 2 Begin");
        System.Threading.Thread.Sleep(3000);
        Console.WriteLine("Task 2 Finish");
      });

      
      task1.Start();
      task2.Start();
      var result = task1.ContinueWith<string>(task =>
      {
        Console.WriteLine("task1 finished!");
        return "This is task result!";
      });

      Console.WriteLine(result.Result.ToString());


      Console.Read();
    }

Task的取消

var tokenSource = new CancellationTokenSource();
      var token = tokenSource.Token;
      var task = Task.Factory.StartNew(() =>
      {
        for (var i = 0; i < 1000; i++)
        {
          System.Threading.Thread.Sleep(1000);
          if (token.IsCancellationRequested)
          {
            Console.WriteLine("Abort mission success!");
            return;
          }
        }
      }, token);
      token.Register(() =>
      {
        Console.WriteLine("Canceled");
      });
      Console.WriteLine("Press enter to cancel task...");
      Console.ReadKey();
      tokenSource.Cancel();

转载于:https://www.cnblogs.com/weloveshare/p/5737336.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值