我现在想知道这一点,所有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
方法,这是正确的吗?
答案 0 :(得分:5)
首先,我真的建议您阅读MSDN / Asynchronous Programming with Async and Await,这对于了解所有async / await是如何工作(幕后)非常有帮助。
实际使用这些技术的原因是UserManager实现通常意味着对数据库起作用,这是“慢速”。在计算机时间(杰夫阿特伍德关于该主题的精彩读物:http://blog.codinghorror.com/the-infinite-space-between-words/)。
因此,UserManager方法允许您在将来为您提供TypeX
或ResultY
,但需要时间。为了在应用程序等待DB回答时释放资源(作为示例),等待线程被置于休眠状态被返回到ThreadPool,并且释放的容量可以用于另一个incomming请求(或在此期间可能异步完成的任何任务)。
编辑:谢谢你@Neil Hibbert
答案 1 :(得分:3)
根据MSDN /异步编程文档:
异步对于可能阻塞的活动至关重要, 例如,当您的应用程序访问Web时。访问网络 资源有时很慢或延迟。如果此类活动被阻止 在同步过程中,整个应用程序必须等待。在一个 异步过程,应用程序可以继续其他工作 在可能阻塞之前,它不依赖于Web资源 任务完成。
数据库调用(特别是在Microsoft Azure等云环境中)阻止了I / O进程,因此ASP.NET身份系统中的大多数API都是异步的。
为什么要清空Task
?返回空Task
是Async/Await Programming
模型中的最佳做法。异步方法有三种可能的返回类型:Task
,Task<T>
;和void
,但异步方法的自然返回类型只是Task
和Task<T>
。从同步代码转换为异步代码时,返回类型T
的任何方法都将成为返回Task<T>
的异步方法,并且返回void
的任何方法都将成为返回Task
的异步方法。< / p>
您应该更喜欢async Task
到async void
。 Async Task
方法可以更轻松地处理错误,可组合性和可测试性。有关更多信息,请阅读以下文章:Best Practices in Asynchronous Programming