最近我一直在处理与 async await 相关的问题(阅读了所有可能的文章,包括Stephen和Jon的最后两章),但我得出了结论,不知道是否正确-因此我的问题。
既然async
只允许存在单词await
,那么我将离开async
。
AFAIU,await
关乎持续性。不要编写函数式(连续性)代码,而是编写同步代码(我喜欢将其称为可回调的代码)。
所以当编译器到达await
时,它将代码分为两个部分并注册第二部分在第一部分完成后执行(我不知道为什么不使用单词callback
-这正是所做的)。 (同时在工作-线程正在做其他事情)。
但是看看这段代码:
public async Task ProcessAsync()
{
Task<string> workTask = SimulateWork();
string st= await workTask;
//do something with st
}
public Task <string> SimulateWork()
{
return ...
}
当线程到达await workTask;
时,它将该方法分为两个部分。因此,在SimulateWork
完成后,方法的继续部分:即//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%正确?
Task
而不是void
,并且应该返回由SimulateWork
返回的Task
- 这样,ProcessAsync
的调用方仍然可以使用await
(或Wait
)在那个Task
上,以知道何时完成。 - Damien_The_UnbelieverProcessAsync
发生了什么时,它才是相关的。确实存在一些情况下,fire and forget是合法的。 - Royi Namir