【问题标题】:How to use async await in asp.net membership provider ValidateUser method?如何在 asp.net 成员提供程序 ValidateUser 方法中使用异步等待?
【发布时间】:2014-05-26 04:18:33
【问题描述】:

我正在使用 asp.net 4.5 Web 应用程序和 asp.net 成员资格。我实现了有一个方法的 MembershipProvider 接口:

public override bool ValidateUser(string username, string password)

此方法中用于我的实现的代码必须进行两次 WCF 服务调用,这可能会很昂贵。本着学习和使用异步的精神和愿望,我想让代码使用异步等待。

我创建了两个需要调用 WCF 服务方法的任务。我不清楚的是如何正确使用“ValidateUser”方法中的异步来调用这些任务。我无法更改此方法签名以添加异步,因为我必须将 bool 更改为 Task,所以我坚持使用异步修饰符无法使用的方法签名。

在这种情况下,我如何调用我的两个任务并让它们在后台线程上运行?我知道我可以使用 Task.Result 但我的理解是这将是一个同步调用并且不赞成。我不确定使用 Task.Result 的好处,因为我的意图是后台线程我的两个 WCF 服务方法调用。

【问题讨论】:

  • 除非在设计时考虑到异步,否则您尝试的任何技巧都可能比保持同步更值得。

标签: asp.net asp.net-membership async-await c#-5.0


【解决方案1】:

好吧,您当然可以在会员提供程序中异步调用任务,只是不能异步调用 ValidateUser。

旧的 Membership API 早在 Async 存在之前就已创建并且不兼容。您可以将其包装在异步方法中。这是一篇关于它的博客文章。

http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx

要点是这样的(更改为用于 ValidateUser)

public Task SleepAsync(int millisecondsTimeout) 
{ 
    return Task.Run(() => Sleep(millisecondsTimeout)); 
}

【讨论】:

  • 谢谢 - 我认为这个故事的寓意是让它保持同步,不要试图异步一切。
  • 那篇博文的一般信息不是不按照您的建议去做吗?这对 Web 应用程序特别有害。为什么有人会写这样的代码:Task.Run(() => Sleep(millisecondsTimeout));?
  • @PauloMorgado - 我没有做出任何价值判断,只是认为它可以完成。但是,是的,没有太多意义。
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多