接口是任务,但我没有任何异步代码
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));
我最近阅读了很多关于 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));