我想为计划创建一个链接逻辑。
但如果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();
}
我是asynchrşnous操作和任务库的新手。这可能吗?
答案 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具有最新更新之一,则只需从“项目属性”,“构建”页面更改语言版本即可。可以从页面底部的“高级”按钮访问语言选项。
在以前的版本中,您必须将所有异步代码提取到单独的方法,并且只使用.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
来阻止并等待结果。注意线程锁。