我最近一直在阅读有关Task的内容,我不得不说我认为我理解了它,但是一旦你阅读了Stephen Cleary和Jon Skeet的博客,我就开始意识到它还有比人们想象的更多。
所以,我正在实现一个基于TASK的接口(这不是我的接口,它是AspNet.Identity IUserPasswordStore的一部分),这是实现这个的正确方法吗?
public Task<bool> HasPasswordAsync(ApplicationUser user)
{
return Task.Factory.StartNew(() => true);
}
这是一个微不足道的问题,但你永远不知道他们可能是“啊,但你知道这会做”
其余的代码都是从异步代码中生长出来的,所以有点只写自己的,我需要将开始/结束模式转换为TAP。
答案 0 :(得分:0)
你读得不够好:)。
在任何情况下,当您只想将结果包装在已完成的任务中时,就不需要启动新的线程池工作。只需使用
Task.FromResult(false)
对于这种情况,可以在界面中公开Task
。但是,如果您只是使用Task.Run
或类似的,请不要。这正是斯蒂芬博客上发现的那些“糟糕的想法”。如果您的界面看起来足够宽,以容纳本质上异步并且同时具有内在同步性的东西,那么您可能需要缩小界面范围。
答案 1 :(得分:0)
我正在实现一个基于TASK的界面,是这样的 正确的方法来实现这个?
一般来说,没有。 You shouldn't expose async wrappers over sync methods。
为什么不这样做?因为它可能会混淆那些认为你的方法纯粹是异步IO绑定操作的最终用户(就像大多数BCL为我们所暴露的那样),但会惊讶地发现它实际上并非如此。
这就是推荐的方法是让用户在新线程上显式调用同步版本。
相反,这样做:
public bool HasPassword(ApplicationUser user)
{
return true;
}
让他委托给他:
var hasPassword = Task.Run(() => HasPassword(user));