zoukankan      html  css  js  c++  java
  • 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'。
  • 相关阅读:
    java 中文排序 中文拼音排序 pinyin4j (怡,阿等) 拂晓风起
    jQuery 和 json 简单例子(注意callback函数的处理!!) (servlet返回json,jquery更新,java json) 拂晓风起
    推荐一个免费在线制作Banner的好地方
    Jquery焦点图/幻灯片效果 插件 KinSlideshow
    C#关于伪静态页面的两种实现方法
    cu3er 3D幻灯切换效果 div被遮住的解决方法
    推荐一个亲子教学网站,悟空学字
    怎么通过小米账号查出买家的手机号?
    添加网页桌面快捷方式的代码
    卖小米资格号怎么才不会受骗,怎么才不会淘宝退款?
  • 原文地址:https://www.cnblogs.com/zkja/p/10265951.html
Copyright © 2011-2022 走看看