具有异步Session_Start方法时的会话问题?

我最近开始使用.NET 4.5而不是.NET 4.0,我喜欢asyncfunction。

但是,当在我的Global.asax中的Session_Start事件中在ASP .NET中使用它时,无论我做什么(如果我执行await并访问会话),它都会导致错误。

这是代码。 我相信你可以复制这个问题。 问题是 – 我该如何解决?

 protected async void Session_Start(object sender, EventArgs e) { var stuff = await UserAccess.RetrieveSomeStuff(); Session["Stuff"] = stuff; } 

我收到的错误如下。

在异步操作仍处于挂起状态时完成异步模块或处理程序。

我也试过以下代码没有运气。

 protected void Session_Start(object sender, EventArgs e) { var stuffTask = UserAccess.RetrieveSomeStuff(); stuffTask.Wait(); Session["Stuff"] = stuffTask.Result; } 

在那种情况下,它将持续处于WaitingForActivation状态,这可能表明它没有被放入系统要执行的任务队列中(可能是因为系统正在等待Wait()调用本身完成? )。

我也试过手动启动任务。 在这种情况下,它只会崩溃,因为您无法手动启动任务。 就我而言,它必须由系统来完成。

任何线索? 这个很难。

您获得的InvalidOperationException是ASP.NET告诉您不能为该事件提供async处理程序的方式。

但实际上,您要做的是启动一些异步资源初始化,然后(异步)在您实际需要时稍后等待它。 因此, Session的对象应该是Task ,如下所示:

 protected void Session_Start(object sender, EventArgs e) { Session["Stuff"] = LoadMyDataAsync(); } static async Task LoadMyDataAsync() { await Task.Delay(1000); return 13; } 

然后你就可以像这样使用它(这个例子是一个ASP.NET MVC 4控制器,但是WebAPI和异步WebPages可以使用类似的技术):

 public async Task Index() { ViewBag.Message = await (Session["Stuff"] as Task); return View(); } 

这有点尴尬因为Session不是强类型的。