【发布时间】:2016-12-21 17:40:17
【问题描述】:
如何从 Global.asax 中的Session_Start 调用 async 方法?
全球.asax:
protected async Task Session_Start(object sender, EventArgs e)
{
Session.Timeout = 10;
// Do some asynch work
await repository.SetStatsInfo(System.DateTime.Now);
}
异步方法:
public async Task SetStatsInfo(DateTime time)
{
using (ApplicationDBContext db = new ApplicationDBContext())
{
// Do stuff (update visitors counter in db) ..
await db.SaveChangesAsync();
}
}
我可以同步运行它(定义void Session_Start 等),它正在工作,但更喜欢异步方式,这样访问数据库就不会阻塞。
像这样使用 Session_Start 的“异步任务”运行,代码没有执行,
session_start 内的断点未命中。
【问题讨论】:
-
克里斯说得对。这没有理由是异步的,因为它根本没有意义。 stackoverflow.com/a/38956850/2410379
-
@DavidPine 但是,当我们需要使用只能作为
async Task<T>调用使用的API 时,我们应该怎么做? Stephen Clearly 告诉我们,我们绝不能调用GetAwaiter()或.Result,因为存在死锁的风险 - 那么 ASP.NET 应用程序的GlobalApplication_Start方法如何安全地调用异步方法?
标签: asp.net-mvc session asynchronous async-await .net-4.5