我认为这是做这种事情的正确方法,但我找不到那么多用单词说明的清晰文档。
我有相关的例程,其中RoutineA对其输入进行一些处理,然后委托给RoutineB来完成实际的工作。例如,假设我可以根据整数索引或某个值的字符串键来做一些工作。我可能有两个例程的重载,一个采用索引,一个采用密钥:
// Do the work based on the int index
public bool RoutineA(int index)
{
// Find the key
string key = {some function of index};
// Let the other overload do the actual work
return RoutineB(key)
}
// Do the work based on the string key
public bool RoutineB(string key)
{
bool result = {some function of key};
return result;
}
现在,假设RoutineB想要异步,那么它就变成了:
// Do the work based on the string key
public async Task<bool> RoutineB(string key)
{
bool result = await {some function of key};
return result;
}
所以...我的问题是,假设RoutineA在调用RoutineB之前没有自己的异步处理,我可以这样编码。请注意,我没有将例程标记为async
(并且我没有await
对RoutineB的调用),从而节省了在调用状态机时构建状态机的开销。
// Do the work based on the int index
public Task<bool> RoutineA(int index)
{
// Find the key
string key = {some function of index};
// Let the other overload do the actual work
return RoutineB(key)
}
答案 0 :(得分:1)
嗯,有一点点差异。假设找到密钥的代码抛出异常。在您的第一个代码中,结果将是一个错误的任务。在第二段代码中,异常将立即抛出给调用者。其中哪一个更可取决于你的情况,说实话。
然而,除此之外,效果几乎相同。