2015-01-21 52 views
-2

我最近一直在阅读有关任务的许多内容,我不得不说我认为我了解它,但是一旦您阅读Stephen Cleary和Jon Skeet的博客,我已经开始意识到那里更多的是它比人们想象的更多。接口是任务,但我没有任何异步代码

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

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

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

代码的其余部分全部由异步代码变得如此有点刚刚写自己,好吧,我需要将开始/结束模式转换为TAP。

+0

请仔细阅读接口部分,我将编辑和添加这就是它不是我的接口。 – 2015-01-21 13:55:58

回答

0

你没有阅读能力不够好:)

在任何情况下,当你只是想在完成任务包的结果,没有必要旋转了新的线程池的工作。只需使用

Task.FromResult(false) 

对于这种情况,可以在接口中公开Task。但是,如果您只是使用Task.Run或类似的,请不要。这正是斯蒂芬博客上发现的那种“糟糕的想法”。如果你的界面看起来足够宽以容纳固有的异步事件并且同时具有固有的同步性,那么你可能需要缩小界面的范围。

+0

谢谢,我应该真的看起来更难:) – 2015-01-21 13:59:39

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