为什么我需要使此方法异步?
Why Do I Need To Make This Method Async?
我有与此非常相似的代码(我稍微简化了代码以展示我试图弄清楚的行为的本质)。
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 关键字导致任务为 运行,然后 return 值是任务的结果。我理解正确吗?
顺便说一句,如果这是一个骗局,或者如果有一些博客帖子讨论了这个,请随时指出我并关闭它。我不是想掩盖我的代表;我正在尝试了解这段代码发生了什么。
编辑:
对于所有提问的人 "why is this method async?"-- 因为我试图构建一个小而简单的代码示例来演示这个问题。我还应该添加一个调用代码示例,但我试图让代码尽可能小和简单。
I'm assuming there's some syntactic sugar involved here
不完全是 "syntactic sugar"。编译器正在生成 状态机 ,因为该方法被标记为 async
。这就是为什么您可以 return 一个 Task<bool>
而无需为 return 值显式创建 Task
。
If I leave off the async keyword, I get a complaint about not being
able to cast a bool to a Task<bool>
.
async
修饰符触发编译器创建状态机。如果删除它,则需要自己创建 Task
。如果出于任何原因你想创建一个 Task<T>
但你实际上是 运行 同步,Task.FromResult
是你的朋友。
我看不出为什么这个方法被标记为 async
。
这与异步无关。关于任务。
你的 returning 一个 bool 和你的函数的 return 值是 Task
public Task<bool> DoSomething()
{
return false;
}
也无法编译。
如果你不做任何异步的事情,你不应该 return 任务。
如果您需要 运行 一些异步操作,这里有一些选项,我希望它们可以使 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
}
}
it seems as if the async keyword is causing the task to be run and then the return value is the result of the task
正确。
此方法中没有任何东西可以从 async
中获益。然而:
If I leave off the async keyword, I get a complaint about not being able to cast a bool
to a Task<bool>
会在来电者身上发生。如果没有看到该代码,您只能一般性地评论您可以:
- 将调用者更改为不假设它正在等待 return。
- 将函数更改为 return
bool
,但在调用者上使用 Task.FromResult(IsNumberOdd(value))
.
我有与此非常相似的代码(我稍微简化了代码以展示我试图弄清楚的行为的本质)。
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 关键字导致任务为 运行,然后 return 值是任务的结果。我理解正确吗?
顺便说一句,如果这是一个骗局,或者如果有一些博客帖子讨论了这个,请随时指出我并关闭它。我不是想掩盖我的代表;我正在尝试了解这段代码发生了什么。
编辑:
对于所有提问的人 "why is this method async?"-- 因为我试图构建一个小而简单的代码示例来演示这个问题。我还应该添加一个调用代码示例,但我试图让代码尽可能小和简单。
I'm assuming there's some syntactic sugar involved here
不完全是 "syntactic sugar"。编译器正在生成 状态机 ,因为该方法被标记为 async
。这就是为什么您可以 return 一个 Task<bool>
而无需为 return 值显式创建 Task
。
If I leave off the async keyword, I get a complaint about not being able to cast a bool to a
Task<bool>
.
async
修饰符触发编译器创建状态机。如果删除它,则需要自己创建 Task
。如果出于任何原因你想创建一个 Task<T>
但你实际上是 运行 同步,Task.FromResult
是你的朋友。
我看不出为什么这个方法被标记为 async
。
这与异步无关。关于任务。
你的 returning 一个 bool 和你的函数的 return 值是 Task
public Task<bool> DoSomething()
{
return false;
}
也无法编译。 如果你不做任何异步的事情,你不应该 return 任务。
如果您需要 运行 一些异步操作,这里有一些选项,我希望它们可以使 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
}
}
it seems as if the async keyword is causing the task to be run and then the return value is the result of the task
正确。
此方法中没有任何东西可以从 async
中获益。然而:
If I leave off the async keyword, I get a complaint about not being able to cast a
bool
to aTask<bool>
会在来电者身上发生。如果没有看到该代码,您只能一般性地评论您可以:
- 将调用者更改为不假设它正在等待 return。
- 将函数更改为 return
bool
,但在调用者上使用Task.FromResult(IsNumberOdd(value))
.