C# 当商店没有';你不支持异步方法吗?

C# 当商店没有';你不支持异步方法吗?,c#,async-await,asp.net-identity,C#,Async Await,Asp.net Identity,我是ASP.NET Identity 2.1和异步/等待编程的新手 我想将ASP.NET Identity与我的用户存储集成,它不支持“异步”方法,特别是Telerik的OpenAccess 在ASP.NET标识中,所有的IUserStore接口(和其他ixxStore)都是仅公开~Async方法。似乎强烈鼓励他们异步实现代码运行。不幸的是,Telerik的OpenAccess不支持方法的~Async版本,所以我必须自己实现它 我搜索了几个示例,发现其中许多示例(不支持~Async)如下所示:

我是ASP.NET Identity 2.1和异步/等待编程的新手

我想将ASP.NET Identity与我的用户存储集成,它不支持“异步”方法,特别是Telerik的OpenAccess

在ASP.NET标识中,所有的
IUserStore
接口(和其他ixxStore)都是仅公开
~Async
方法。似乎强烈鼓励他们异步实现代码运行。不幸的是,Telerik的OpenAccess不支持方法的
~Async
版本,所以我必须自己实现它

我搜索了几个示例,发现其中许多示例(不支持
~Async
)如下所示:

public Task<AspNetUser> FindByIdAsync(string userId)
{
    if (string.IsNullOrEmpty(userId)) throw new ArgumentException("userId");

    var user = this.Context.AspNetUsers.Where(o => o.Id == userId).SingleOrDefault();
    return Task.FromResult<AspNetUser>(user);
}

哪一种方法是正确的?或者有没有其他方法来实现那些不支持本机
~Async
方法的存储的ASP.NET标识?

的确
TaskFactory.FromResult
不是合适的异步代码,特别是因为底层API正在执行I/O绑定操作(这是异步的完美匹配)。但是,没有办法强制非异步API成为异步API;你只需要让Telerik修复他们的API

同时,您提到的任何一种方法都可以,但是
TaskFactory.FromResult
方法更优越。一般来说,您应该避免在ASP.NET上运行
Task.Run
,因为它会不必要地干扰线程池


当一个任务同步完成时,该函数将正常工作。当然,该方法使用阻塞而不是异步并不理想,但它可以工作。

不,那些简单的实现不是“适当的异步”。。。但是请记住,很多项目(包括遗留项目和最近的项目)都没有在任何地方使用异步/等待范式,而将身份提供者的接口强制应用到项目上通常被认为是不受欢迎和急迫的。因此,“您可以称之为异步的,但无论如何,我们将像其他98%的代码库一样实现它”的方法。谢谢您的评论。这些
UserStore
接口由AspNet
UserManager
使用,而不是我自己的代码。它(
UserManager
)可能以异步期望调用我的实现。换句话说,如果一个库强制以异步方式扩展它,我该如何正确地实现呢?事实上,你的问题是正确的!我刚才是在评论您遇到的那些典型的非异步实现的起源(根据经验)。谢谢您的回答。事实上,我对异步方法中的非异步API感到不舒服,但似乎我必须在异步API可用之前使用它。@gongdoong:你的想法是对的。您的代码正在解决Telerik API的一个缺点。不幸但不可避免。
public Task<AspNetUser> FindByIdAsync(string userId)
{
    if (string.IsNullOrEmpty(userId)) throw new ArgumentException("userId");

    return Task.Run(() =>
        this.Context.AspNetUsers.Where(o => o.Id == userId).SingleOrDefault()
    ).ConfigureAwait(false);
}
public async Task<AspNetUser> FindByIdAsync(string userId)
{
    if (string.IsNullOrEmpty(userId)) throw new ArgumentException("userId");

    return await Task.Run(() =>
        this.Context.AspNetUsers.Where(o => o.Id == userId).SingleOrDefault()
    ).ConfigureAwait(false);
}