【发布时间】:2022-02-08 06:55:25
【问题描述】:
假设我有一个现有的async 方法返回一个运行良好的任务。它等待并且本身被正确等待。此方法采用int 参数:
public async Task<MyType> MyMethod(int foo)
{
// .. do stuff
}
我们想更新这个方法来接受一个字符串,如果我们可以从字符串中解析一个 int,然后做我们一直做的事情(移动到一个新的辅助方法),否则,如果我们可以解析一个Guid,然后调用不同(但非常相似)的方法。如果两种类型都不会解析,则返回空/noop 结果:
public async Task<MyType> MyMethod(string foo)
{
if ( int.TryParse(foo, out int bar))
{
return MyIntHelper(bar);
}
else if (Guid.TryParse(foo, out Guid bar))
{
return MyGuidHelper(bar);
}
else return MyNoop();
}
private async Task<MyType> MyIntHelper(int foo)
{
// original ".. do stuff" here
}
private async Task<MyType> MyGuidHelper(Guid foo)
{
// similar ".. do stuff" here, but using a Guid instead
}
问题是,在更新的MyMethod() 中,我是否需要await 辅助方法的结果,或者因为我已经返回了一个任务并且任何必要的等待仍在调用者和子方法中我已经介绍过了?
作为一些背景知识,这是在更新控制器以接受额外的“端点”的上下文中,但实际上我想尽可能地将问题与该上下文分离。
【问题讨论】:
-
MyMethod并不真正需要异步。您可以从任一辅助方法返回任务。虽然这确实改变了调用者观察异常的方式。 -
@JeremyLakeman 作为目标的一部分是尽可能地匹配原件,它可能应该保持异步。但我对这个问题持开放态度。
-
由于
MyMethod在第一个潜在await之前完成了所有工作,然后立即返回结果。使其成为异步方法只会增加复杂性。唯一外部可见的副作用是MyMethod在await之前抛出异常。并且调用者只会关心他们是否有类似var task = ....; <something>; await task;
标签: c# async-await