【发布时间】:2014-06-16 11:09:08
【问题描述】:
我最近处理了很多 async await(阅读所有可能的文章,包括 Stephen 和 Jon 的最后 2 章),但我得出了结论,我不知道是不是100% 正确。 - 所以我的问题。
由于async 只允许出现await 这个词,我将把async 放在一边。
AFAIU,await 就是关于 continuation 的。与其编写功能(连续)代码,不如编写同步代码。 (我喜欢将其称为 callback'able 代码)
因此,当编译器到达await 时 - 它会将代码拆分为 2 个部分,并在第一部分完成后注册要执行的第二部分(我不知道为什么单词 callback 不是' t used - 这正是我们所做的)。 (同时工作 - 线程又回来做其他事情了)。
但是看看这段代码:
public async Task ProcessAsync()
{
Task<string> workTask = SimulateWork();
string st= await workTask;
//do something with st
}
public Task <string> SimulateWork()
{
return ...
}
当线程到达await workTask; 时,它会将方法拆分为 2 个部分。所以在 SimulateWork 完成之后 - 方法的继续:AKA : //do something with st - 被执行。
一切正常
但是如果方法是:
public async Task ProcessAsync()
{
Task<string> workTask = SimulateWork();
await workTask; //i don't care about the result , and I don't have any further commands
}
这里 - 我 不需要 需要继续,意思是 - 我不需要 await 来拆分方法,这意味着 - 我不需要 async /await 这里全部!,我仍然会有相同的结果/行为!
所以我可以这样做:
public void ProcessAsync()
{
SimulateWork();
}
问题:
- 我的诊断是否 100% 正确?
【问题讨论】:
-
要 100% 完全重写,您仍然应该返回
Task而不是void并且应该返回由SimulateWork返回的Task- 这样,调用者ProcessAsync的await(或Wait)仍然可以在Task上知道您何时完成。 -
您应该始终关心任务的完成方式。
-
@PauloMorgado 我不同意这种说法。在我的示例中,只有当我需要知道
ProcessAsync发生了什么时,它才是相关的。在某些情况下,火灾和遗忘是合法的。 -
任务错误结束会怎样?
-
就像执行后台线程时一样,您将在该线程内处理错误。 ( 试着抓)。如果关于延续和 A 取决于 B - 那么就像我说的 - 使用 await/continue with
标签: c# .net task-parallel-library async-await c#-5.0