• c#Task类。实现异步的一种方式


    Task和Task<TResult>是c#提供的一种实现异步功能的2个类。Task<TResult>继承Task类,有返回参数。
    1、基本用法 不嵌套
    利用静态方法创建和运行任务:
    //无返回参数,Action委托作为参数。有参数,无返回值
    Task.Run( ()=>{                                //Action委托
    Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");
    });
    //有返回参数,func委托作为参数。有参数,有返回值
    Task<string> t=Task.Run<string>(()=>{          //Func<TResult>委托
    string str="有参任务"
    return str;
    });
    //开启另一个任务等待完成,并输出结果
    Task cwt = t.ContinueWith(m => { 
        Console.WriteLine("任务完成后的执行结果:{0}", m.Result.ToString());
    //Action<Task<TResult>>委托,m代表mycaller即调用者,在这里m=t.
      });
    
    利用构造函数创建和执行任务:
    //此处只说明有返回值情况   
       Task<int> t = new Task<int>(() => {
      int sum=0; 
      Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");
      for (int i = 0; i < 10; i++)
      {
        sum =+ i;
      }
      return sum;
      });
    //启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)
    
      t.Start();
    //等待任务的完成执行过程。这里有两种方法,一种,使用已创建任务的Wait方法。会在这里形成阻塞
      t.Wait(); 
    【另一种不会形成阻塞的方法:使用已创建任务的ContinueWith方法。作用:任务完成后,再开启另外一个任务,对结果进行处理。
    
      Task cwt = t.ContinueWith(m => { 
        Console.WriteLine("任务完成后的执行结果:{0}", m.Result.ToString()); 
      });
    】
    //获得任务的执行结果
      Console.WriteLine("任务执行结果:{0}", t.Result.ToString());
    

     2、任务嵌套。父任务,子任务。

    通过Task类创建的任务是顶级任务,可以通过使用 TaskCreationOptions.AttachedToParent 标识把这些任务与创建他的任务相关联,所有子任务全部完成以后父任务才会结束操作。示例如下:

    1: static void ParentChildTask() {
    2:   Task<string[]> parent = new Task<string[]>(state => {
    3:     Console.WriteLine(state);
    4:     string[] result=new string[2];
    5: //创建并启动子任务
    6:     new Task(() => { result[0]= "我是子任务1。"; },TaskCreationOptions.AttachedToParent).Start();
    7:     new Task(() => { result[1] = "我是子任务2。"; }, TaskCreationOptions.AttachedToParent).Start();
    8:      return result;
    9:     },"我是父任务,并在我的处理过程中创建多个子任务,所有子任务完成以后我才会结束执行。");
    10: //任务处理完成后执行的操作
    11: parent.ContinueWith(t => {
    12:    Array.ForEach(t.Result, r=>Console.WriteLine(r));
    13:    });
    14: //启动父任务
    15: parent.Start();
    16: Console.Read();
    17: }
    

    如果需要创建一组具有相同状态的任务时,可以使用TaskFactory类或TaskFactory<TResult>类。这两个类创建一组任务时可以指定任务的CancellationToken、TaskCreationOptions、TaskContinuationOptions和TaskScheduler默认值。示例代码:

    1: static void TaskFactoryApply()
    2: {
    3: Task parent = new Task(() =>
    4: {
    5: CancellationTokenSource cts = new CancellationTokenSource(5000);
    6: //创建任务工厂
    7: TaskFactory tf = new TaskFactory(cts.Token, TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
    8: //添加一组具有相同状态的子任务
    9: Task[] task = new Task[]{
    10: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第一个任务。"); }),
    11: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第二个任务。"); }),
    12: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第三个任务。"); })
    13: };
    14: });
    15: parent.Start();
    16: Console.Read();
    17: }
    

      

     
  • 相关阅读:
    vue 封装tarbar组件
    vue 路由守卫
    mint ui switch 开关
    数据库与实例的关系
    Grafana使用总结
    阿里P7前端需要哪些技能
    laravel -- 自定义Api接口全局异常处理
    laravel -- 单元测试
    laravel 项目迁移后重新生成链接文件
    laravel HTTP 请求, 接受参数处理
  • 原文地址:https://www.cnblogs.com/crhdyl/p/4900449.html
Copyright © 2020-2023  润新知