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'。
posted @ 2019-01-14 11:35  大长腿的猪  阅读(231)  评论(0编辑  收藏  举报