接口是任务,但我没有任何异步代码

Interface is Task but I dont have any async code

我最近阅读了很多关于 Task 的文章,我不得不说我以为我理解了它,但是一旦您阅读了 Stephen Cleary 和 Jon Skeet 的博客,我就开始意识到它的意义远比人们想象的要多。

所以,我正在实现一个基于 TASK 的接口(这不是我的接口,它是 AspNet.Identity IUserPasswordStore 的一部分),这是实现它的正确方法吗?

public Task<bool> HasPasswordAsync(ApplicationUser user)
{
    return Task.Factory.StartNew(() => true);
}

这是一个微不足道的问题,但你永远不知道它们可能是 "ah, but did you know that this will do"

其余的代码都是从异步代码发展而来的,所以有点像自己写,好吧,我需要将 begin/end 模式转换为 TAP。

你读得不够好:)

无论如何,当您只想将结果包装在已完成的任务中时,无需启动新的线程池工作。只需使用

Task.FromResult(false)

对于这种情况,可以在界面中公开 Task。但是,如果您只是使用 Task.Run 或类似的,请不要使用。这正是您可以在 Stephen 的博客 "bad ideas" 上找到的内容。如果您的界面看起来足够宽,可以容纳本质上异步但同时又本质上同步的事物,您可能需要缩小界面范围。

I am implementing an interface that's based on TASK , Is this the correct way to implement this ?

一般来说,不会。 You shouldn't expose async wrappers over sync methods

你为什么不应该这样做?因为它可能会让最终用户感到困惑,他们认为您的方法纯粹是一个异步 IO 绑定操作(因为这是大多数 BCL 为我们公开的内容),但会惊讶地发现它实际上不是。

这就是为什么推荐的方法是让用户在新线程上显式调用同步版本

相反,这样做:

public bool HasPassword(ApplicationUser user)
{
    return true;
}

然后让委托:

var hasPassword = Task.Run(() => HasPassword(user));