• Task 使用


    Task 常规使用

    无返回值Task

    普通的无返回值方法:

     static void Main(string[] args)
      {
         Console.WriteLine("开始调用");
        GetTest();
        Console.WriteLine("结束调用");
      }
      /// <summary>
      /// 普通无返回值方法
      /// </summary>
      static void GetTest() {
        Console.WriteLine("普通无返回值方法");
      }
    

    实现异步的方法只用方法添加 async关键字, 方法内部有await 等待执行就可以了

    static void Main(string[] args)
      {
         Console.WriteLine("开始调用");
        GetTaskAsync();
        Console.WriteLine("结束调用");
      }
        /// <summary>
        /// 无返回值
        /// </summary>
        /// <returns></returns>
       static async Task GetTaskAsync()
       {
         await Task.Delay(1000);
         Console.WriteLine("测试方法");
        }
    

    效果图如下

    当然如果方法无async和await想实现异步也是可以的,
    需要开启一个任务,然后返回Task.FromResult(0),当一个方法的返回类型为Task的时候使用Task.FromResult(0)进行返回。

    static void Main(string[] args)
      {
         Console.WriteLine("开始调用");
        GetTask2();
        Console.WriteLine("结束调用");
      }
       static Task GetTask2()
        {
          Task.Run(() =>
          {
            Thread.Sleep(1000);
            Console.WriteLine("测试方法2");
          });
            return Task.FromResult(0);
        }
    
    

    效果图如下

    带有返回值的Task

    直接泛型返回类型即可

    static void Main(string[] args)
      {
         Console.WriteLine("开始调用");
        Task<string> task= GetTaskAsync();
        Console.WriteLine("结束调用");
      }
       /// <summary>
       /// 返回string类型的
       /// </summary>
       /// <returns></returns>
       static async  Task<string> GetTaskAsync()
       {
         await Task.Delay(5000);
         Console.WriteLine("测试方法");
         return "测试方法执行结束";
       }
    
    


    如果想获得异步方法的返回值task.Result即可,task.Result会等待线程,直至返回值返回,在继续当前线程。

    static void Main(string[] args)
      {
         Console.WriteLine("开始调用");
        Task<string> task= GetTaskAsync();
        Console.WriteLine( task.Result);
        Console.WriteLine("结束调用");
      }
    

    效果如下,变成了同步

    如果在异步方法中使用,调用返回值就需要用await关键字

    /// <summary>
    /// 返回string类型的
    /// </summary>
    /// <returns></returns>
    static async Task<string> GetTaskAsync()
    {
      Console.WriteLine("测试方法开始执行");
      await Task.Delay(1000);
      string str = await GetTaskAsync2();//异步方法直接调用
      return str;
     }
    
     static async Task<string> GetTaskAsync2()
     {
        await Task.Delay(1000);
        Console.WriteLine("测试方法2");
        return "测试方法2执行结束";
     }
    

    注意事项

    1. 使用 'async/await’ 修饰方法时,应该始终返回 Task 。

    因为使用了异步方法 async/await 时,当没有值需要返回时,使用了 void 造成直接释放对象,如果没有返回值,则返回 Task,如果有返回值,则使用 Task ;当一个异步方法内部没有返回 Task 的时候,基于任务的异步模式(TAP)并不知道异步任务的状态。

    /// <summary>
    /// 不推荐
    /// </summary>
    /// <returns></returns>
    public async void Put(){
      var result=await XXX();
    }
    /// <summary>
    /// 推荐
    /// </summary>
    /// <returns></returns>
    public async Task Put(){
      var result=await XXX();
    }
    
    1. Task 获取返回值推荐使用'await'获取,不推荐使用'task.Result'。
  • 相关阅读:
    NopCommerce代码结构
    至于你信不信,我反正是信了——以类为单位的编程思想
    男人的小金库藏在哪里?——公共数据集Model
    老婆使用说明书——注册系统的逻辑与结构
    ASP.NET学习参考站点
    学了N年英语,你学会翻译了吗?——最基本的数据库连接
    编程也讲禅,您读过《金刚经》吗?——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(上)
    文件夹病毒专杀工具
    不想当将军的学生,不是好程序员——数据访问层DAL——程序结构的思考
    html的标签一共有多少个?
  • 原文地址:https://www.cnblogs.com/zkja/p/10265951.html
Copyright © 2020-2023  润新知