如何创建链接任务

时间:2018-05-10 11:31:20

标签: c# async-await task-parallel-library

我想为计划创建一个链接逻辑。

  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();
    
    }
    
  4. 我是asynchrşnous操作和任务库的新手。这可能吗?

2 个答案:

答案 0 :(得分:3)

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具有最新更新之一,则只需从“项目属性”,“构建”页面更改语言版本即可。可以从页面底部的“高级”按钮访问语言选项。

详细介绍了herehere

在以前的版本中,您必须将所有异步代码提取到单独的方法,并且只使用.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);
}

答案 1 :(得分:2)

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

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();
}

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