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

时间:2015-01-21 08:39:07

标签: c# task-parallel-library async-await task

我最近一直在阅读有关Task的内容,我不得不说我认为我理解了它,但是一旦你阅读了Stephen Cleary和Jon Skeet的博客,我就开始意识到它还有比人们想象的更多。

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

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

这是一个微不足道的问题,但你永远不知道他们可能是“啊,但你知道这会做”

其余的代码都是从异步代码中生长出来的,所以有点只写自己的,我需要将开始/结束模式转换为TAP。

2 个答案:

答案 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));