如何创建链接任务
How to create chaining tasks
我想用 for schedule 创建一个链接逻辑。
- 访问令牌将每 1 小时获取一次。
- 如果访问令牌获取成功,获取版本
但如果 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 具有最新更新之一,您只需从“项目属性”、“构建”页面更改您的语言版本。可以从页面底部的“高级”按钮访问语言选项。
在以前的版本中,您必须将所有异步代码提取到一个单独的方法中,并且只使用 .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);
}
我想用 for schedule 创建一个链接逻辑。
- 访问令牌将每 1 小时获取一次。
- 如果访问令牌获取成功,获取版本
但如果 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 具有最新更新之一,您只需从“项目属性”、“构建”页面更改您的语言版本。可以从页面底部的“高级”按钮访问语言选项。
在以前的版本中,您必须将所有异步代码提取到一个单独的方法中,并且只使用 .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);
}