我的代码与此非常相似(我已经简化了一些代码来演示我想要弄清楚的行为的本质)。
public async System.Threading.Tasks.Task<bool> IsNumberOdd(int numToTest)
{
if (numToTest % 2 == 0)
{
return false;
}
else
{
return true;
}
}
如果我不使用async
关键字,我会收到有关无法将bool
投放到Task<bool>
的投诉。我假设这里涉及一些语法糖。看看IL(我不是非常熟悉IL),似乎async关键字导致任务运行,然后返回值是任务的结果。我能正确理解吗?
顺便说一句,如果这是一个骗局,或者如果有一些博客文章讨论这个,请随时指出并关闭它。我不是想填补我的代表;我试图了解这段代码发生了什么。
编辑:
对于那些问“为什么这个方法是异步的?”的人 - 因为我试图构建一个小而简单的代码示例来演示这个问题。我本来应该添加一个调用代码的例子,但我试图保持代码尽可能小而简单。
答案 0 :(得分:4)
我假设这里涉及一些语法糖
不完全是“语法糖”。编译器正在生成状态机,因为该方法被标记为async
。这就是为什么您可以返回Task<bool>
而不显式为返回值创建Task
。
如果我不使用async关键字,我会收到有关不存在的投诉 能够将一个布尔值转换为
Task<bool>
。
async
修饰符是触发编译器创建状态机的原因。如果删除它,则需要自己创建Task
。如果您出于任何原因想要创建Task<T>
但实际上是在同步运行,Task.FromResult
就是您的朋友。
我认为没有理由将此方法标记为async
。
答案 1 :(得分:2)
似乎async关键字导致任务运行,然后返回值是任务的结果
正确。
此方法中没有任何内容可以从async
中受益。但是:
如果我不使用async关键字,我会收到有关无法将
的投诉bool
投放到Task<bool>
调用者会发生这种情况。在没有看到该代码的情况下,人们通常只能评论您可以:
bool
,但在来电者上使用Task.FromResult(IsNumberOdd(value))
。答案 2 :(得分:0)
不是关于异步的。关于任务。
你返回一个bool,你的函数的返回值是Task
public Task<bool> DoSomething()
{
return false;
}
也无法编译。 如果你没有做任何异步的事情,你就不应该返回任务。
如果你需要异步运行某些东西,我希望这里有一些选项可以使async / await的使用更加清晰。
public class Sample
{
public async void RunSample()
{
// return a task. later obtain a result if some fashion
Task<bool> task = DoSomethingAsync();
bool res1 = task.Result;
// await a task which is created for you by re-wrapping the result.
bool res2 = await AwaitSomethingAsync();
// await a task which is created for you by rewrapping the result due to await.
bool res3 = await DoSomethingAsync2();
// await a task.
bool res4 = await DoSomethingAsync();
}
public async Task<bool> DoSomethingAsync2()
{
return false;
}
public Task<bool> DoSomethingAsync()
{
return Task<bool>.Run(() => { return false; });
}
public async Task<bool> AwaitSomethingAsync()
{
bool res = await Task<bool>.Run(() => { return false; });
return res; // re-wraps it in a Task
}
}