如何创建链接任务

How to create chaining tasks

我想用 for schedule 创建一个链接逻辑。

  1. 访问令牌将每 1 小时获取一次。
  2. 如果访问令牌获取成功,获取版本
  3. 但如果 version.HasNextVersion false,访问令牌将继续。

    public async Task<string> GetAccessToken(){
      /// getting token from server as async.
    }
    
    public async Task<string> GetVersions(string token){
        // Web request as async
        var version = await GetVersionsFromServer(token); 
    
       // if there are any other version after this version, I will get the next
        if(version.HasNextVersion) 
           await GetVersions();
    }
    
    string Main(){
    
     var accessToken = GetAccessToken().Wait();
    
     var version =  GetVersions(string token).Wait();
    
    }
    

我是异步操作和任务库的新手。这可能吗?

正确的方式(除了入口点之外一直异步):

public async Task<string> GetAccessToken(){
    return "token";
}

public async Task<string> GetVersions(string token){
    var version = await GetVersionsFromServer(token); 

    if(version.HasNextVersion) 
       version = await GetVersions();

   // you need to return something!
   return version;
}

private async Task DoWork() {
  var accessToken = await GetAccessToken();
  var version =  await GetVersions(accessToken);
}

string Main(){
 DoWork().Wait();
}

否则,您可以在 Task 上使用 .Result 而不是 .Wait() 来阻止并等待结果。注意线程锁。

await 已经链接了任务。它不会异步地 运行 做任何事情。它等待已经完成的异步操作完成,然后继续执行异步操作后的代码。

如果实际问题是 how do I await in Main,在 C# 7.1 中你可以有一个 async Task Main() 签名,例如:

public static async Task Main(string[] args)
{

   var accessToken = await GetAccessToken();
   var version =  await GetVersions(string token);
}

如果您的 Visual Studio 2017 具有最新更新之一,您只需从“项目属性”、“构建”页面更改您的语言版本。可以从页面底部的“高级”按钮访问语言选项。

这个描述的很详细here and here

在以前的版本中,您必须将所有异步代码提取到一个单独的方法中,并且只使用 .Wait() 一次:

public static void Main(string[] args)
{
    InnerMain(args).Wait();
}

private static async Task InnerMain(string[] args)
{
   var accessToken = await GetAccessToken();
   var version =  await GetVersions(string token);
}