具有异步Session_Start方法时的会话问题?
我最近开始使用.NET 4.5而不是.NET 4.0,我喜欢async
function。
但是,当在我的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
不是强类型的。