【发布时间】:2017-06-07 10:22:17
【问题描述】:
我有一个接口迫使我实现一个(异步)任务:
namespace Microsoft.Owin.Security.Infrastructure
{
public interface IAuthenticationTokenProvider
{
..
Task CreateAsync(AuthenticationTokenCreateContext context);
..
}
}
我想实现这个方法,但我没有等待任何东西。虽然我必须等待或返回一些任务,否则我的代码无法编译。:
public class MyImplementation: IAuthenticationTokenProvider
{
public async Task CreateAsync(AuthenticationTokenCreateContext context)
{
/// do something synchronously.
await something here? ??
}
}
我的问题是:如何在不异步执行某些操作的情况下实现此方法?我已经找到了几个解决方案(等待 task.Yield()
或 await Task.Run(() => {}))
,但我无法完全理解正确的实现方式和原因。
【问题讨论】:
-
如果你不等待任何东西,你的代码应该编译得很好——它实际上不会是异步的。如果在您的情况下基本上有一个不执行任何 IO 的快速实现,那可能没问题 - 但否则您应该真正异步地做事......
-
如果这样做,我会在编译时收到警告:“异步方法缺少 'await' 运算符并将同步运行”。为什么我会收到此警告?为什么重要?
-
警告不言自明——你有一个异步方法,但它是同步完成的。在你的情况下,这可能是你想要的。如果不知道
CreateAsync
方法的主体是做什么的,就很难说清楚。如果它总是很快,那很好,你可以取消那段代码的警告。 -
让我们看看我是否做对了。就我而言,我想编写以下代码: public Task CreateAsync(AuthenticationTokenCreateContext context) { return Task.FromResult(0); } 因为它不是异步的?
-
如果您实际上不想做任何异步操作,您可以这样做。但我们不知道同步运行所有代码是否合适,因为我们不知道那段代码是什么。正如 hvd 在 cmets 中提到的那样,这在异常处理方面效果不佳 - 除了 可能 参数验证之外,异步方法通常会返回错误任务而不是抛出异常。
标签: c# asynchronous task