ASP.NET Identity UserStore:为什么要返回Task?

时间:2015-04-16 08:06:57

标签: c# asp.net asp.net-mvc asp.net-identity

我现在想知道这一点,所有UserStore方法都会返回Task或键入的Task<T>,但为什么会这样?为什么不回T? 我知道它们是Aync方法并且是OWIN中间件的一部分,这与它有关吗?

我还注意到一些返回普通旧Task的方法实际上返回一个空的Task。 asp.net网站的示例返回Task.FromResult<object>(null) http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity。 我还看到Task.FromResult(0),如果我返回一个Action的任务:

return new Task(() =>
{
    context.User.Add(new User); context.SaveChanges()
})

然后调用Action内的Task。为什么这个以及返回空Task的重点是什么?在我看来,返回Task类似于void方法,这是正确的吗?

2 个答案:

答案 0 :(得分:5)

首先,我真的建议您阅读MSDN / Asynchronous Programming with Async and Await,这对于了解所有async / await是如何工作(幕后)非常有帮助。

实际使用这些技术的原因是UserManager实现通常意味着对数据库起作用,这是“慢速”。在计算机时间(杰夫阿特伍德关于该主题的精彩读物:http://blog.codinghorror.com/the-infinite-space-between-words/)。

因此,UserManager方法允许您在将来为您提供TypeXResultY,但需要时间。为了在应用程序等待DB回答时释放资源(作为示例),等待线程被置于休眠状态被返回到ThreadPool,并且释放的容量可以用于另一个incomming请求(或在此期间可能异步完成的任何任务)。

编辑:谢谢你@Neil Hibbert

答案 1 :(得分:3)

根据MSDN /异步编程文档:

  

异步对于可能阻塞的活动至关重要,   例如,当您的应用程序访问Web时。访问网络   资源有时很慢或延迟。如果此类活动被阻止   在同步过程中,整个应用程序必须等待。在一个   异步过程,应用程序可以继续其他工作   在可能阻塞之前,它不依赖于Web资源   任务完成。

数据库调用(特别是在Microsoft Azure等云环境中)阻止了I / O进程,因此ASP.NET身份系统中的大多数API都是异步的。

为什么要清空Task?返回空TaskAsync/Await Programming模型中的最佳做法。异步方法有三种可能的返回类型:TaskTask<T>;和void,但异步方法的自然返回类型只是TaskTask<T>。从同步代码转换为异步代码时,返回类型T的任何方法都将成为返回Task<T>的异步方法,并且返回void的任何方法都将成为返回Task的异步方法。< / p>

  • 异步void方法具有不同的错误处理语义。当一个 异常被抛出异步任务或异步任务&lt; T&gt;方法, 该异常被捕获并放置在Task对象上。用异步 void方法,没有Task对象,因此抛出任何异常 一个异步void方法将直接在 在async void方法时处于活动状态的SynchronizationContext 启动。
  • 异步void方法具有不同的组合语义。异步方法 返回任务或任务&lt; T&gt;可以使用await轻松编写, Task.WhenAny,Task.WhenAll等等。异步方法返回void 不提供一种简单的方法来通知他们的调用代码 完成。很容易启动几个异步void方法,但它是 他们完成时不容易确定。异步void方法会 在他们开始和结束时通知他们的SynchronizationContext,但是a 自定义SynchronizationContext是常规的复杂解决方案 应用程序代码。
  • 异步void方法很难测试。因为差异 在错误处理和编写中,编写单元测试很困难 调用异步void方法。 MSTest异步测试支持 仅适用于返回任务或任务&lt; T&gt;的异步方法。这是可能的 安装一个SynchronizationContext,检测所有异步无效的时间 方法已经完成并收集任何异常,但它很多 更容易让异步void方法返回Task。

您应该更喜欢async Taskasync voidAsync Task方法可以更轻松地处理错误,可组合性和可测试性。有关更多信息,请阅读以下文章:Best Practices in Asynchronous Programming