使用async Session_Start方法时出现会话问题

本文关键字:会话 问题 方法 async Session Start 使用 | 更新日期: 2023-09-27 18:01:42

我最近开始使用。net 4.5而不是。net 4.0,我很喜欢async的特性。

然而,当使用它在asp.net的Session_Start事件在我的全局。因此,无论我做什么(如果我执行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()调用本身完成?)。

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

什么线索吗?

使用async Session_Start方法时出现会话问题

您得到的InvalidOperationException是ASP。. NET的方式告诉你,你不能有一个async处理程序的事件。

但实际上,你想做的是开始一些异步资源初始化,然后(异步)等待它以后当你真正需要它。所以Session中的对象应该是Task<T>,像这样:

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

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

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

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