Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用异步会话启动方法时出现会话问题?_C#_Asp.net_Asynchronous - Fatal编程技术网

C# 使用异步会话启动方法时出现会话问题?

C# 使用异步会话启动方法时出现会话问题?,c#,asp.net,asynchronous,C#,Asp.net,Asynchronous,我最近开始在.NET4.0上使用.NET4.5,我喜欢async特性 但是,当在ASP.NET的my Global.asax的Session_Start事件中使用它时,无论我做什么(如果我执行等待并访问会话),都会导致错误 这是密码。我相信你可以复制这个问题。问题是——我该如何解决它 protected async void Session_Start(object sender, EventArgs e) { var stuff = await UserAccess.RetrieveS

我最近开始在.NET4.0上使用.NET4.5,我喜欢
async
特性

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

这是密码。我相信你可以复制这个问题。问题是——我该如何解决它

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;
}
在这种情况下,它的状态将是持续等待激活,这可能表明它没有被放入系统要执行的任务队列中(可能是因为系统正在等待
Wait()
调用自身完成?)

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


有线索吗?这个问题很难解决。

您得到的
invalidoOperationException
是ASP.NET告诉您不能为该事件使用
async
处理程序的方式

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

protected void Session_Start(object sender, EventArgs e)
{
    Session["Stuff"] = LoadMyDataAsync();
}

static async Task<int> LoadMyDataAsync()
{
    await Task.Delay(1000);
    return 13;
}
受保护的无效会话\u启动(对象发送方,事件参数e)
{
会话[“Stuff”]=LoadMyDataAsync();
}
静态异步任务LoadMyDataAsync()
{
等待任务。延迟(1000);
返回13;
}
然后您可以这样使用它(这个示例是ASP.NET MVC 4控制器,但WebAPI和异步网页可以使用类似的技术):

公共异步任务索引()
{
ViewBag.Message=wait(会话[“填充”]作为任务);
返回视图();
}

这有点尴尬,因为
会话
不是强类型的。

您是否尝试过通过Task.Factory.StartNew手动启动任务?我最后使用了这个方法,对会话进行了扩展,(通过泛型)是强类型的。这将与AsynCTP包一起使用?@ArmanBimatov:否。您无法在ASP.NET上安全地使用AsyncCTP或Microsoft.Bcl.Async。那么,此处用于wait/Async的库是什么?名称空间是什么?它不工作。。。如果定义了异步任务,则在会话的调用上_startsession[“Stuff”]=LoadMyDataAsync();,必须使用wait LoadMyDataAsync();,
public async Task<ActionResult> Index()
{
    ViewBag.Message = await (Session["Stuff"] as Task<int>);
    return View();
}