使用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()
调用本身完成?)。
我还尝试手动启动任务。在这种情况下,它只会崩溃,因为您无法手动启动任务。就我而言,这必须由系统来完成。
什么线索吗?
您得到的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
不是强类型的