gpt4 book ai didi

asp.net - 在从 PageAsyncTask 调用的方法中时,HttpContext.Current 为 null

转载 作者:行者123 更新时间:2023-12-02 00:14:37 26 4
gpt4 key购买 nike

我有一个场景,我有一个页面,单击按钮会打开一个对话框,在单击按钮打开的对话框表单中,我可以从选定的 .txt 文件中读取数据列表并构建查询并将数据添加到一些数据库表。由于可能存在大量数据,因此此过程可能需要很长时间,因此用户在上传完成之前将无法在应用程序上工作。因此,为了使上传过程异步,我正在使用 PageAsyncTask。下面是代码示例,但在 PageAsyncTask 中调用的方法中,HttpContext.Current 为空,因此我无法使用 session 处理。请对此提供任何指导,为什么这是空的,在这种情况下我如何使用 session

   protected void BtnUpload_click(object sender, EventArgs e)
{
PageAsyncTask asyncTask1 = new PageAsyncTask(OnBegin, OnEnd, OnTimeout, SessionManager.UserData, true);

Page.RegisterAsyncTask(asyncTask1);
Page.ExecuteRegisteredAsyncTasks();
}

public IAsyncResult OnBegin(object sender, EventArgs e,
AsyncCallback cb, object extraData)
{
_taskprogress = "AsyncTask started at: " + DateTime.Now + ". ";
uData = extraData as UserData;

_dlgt = new AsyncTaskDelegate(BeginInvokeUpload);
IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);

return result;
}

private void BeginInvokeUpload()
{
string selectedFileName = string.Empty;
string returnValuePage = string.Empty;
User teller = new User();
SessionManager.UserData = uData;
}



private void BeginInvokeUpload()
{
string selectedFileName = string.Empty;
string returnValuePage = string.Empty;
User teller = new User();
SessionManager.UserData = uData;
}

public class SessionManager
{
public static UserData UserData
{
get
{
UserData userData = null;
if (HttpContext.Current.Session["UserData"] != null)
{
userData = HttpContext.Current.Session["UserData"] as UserData;
}
return userData;
}
set
{
HttpContext.Current.Session["UserData"]=value;
}
}
}

最佳答案

答案很简单:如果 HttpContext.Current is null 则不能使用 session 。

因此,如果您需要修改 session ,您不能简单地修改,唯一的选择是制作您完全自定义的 session 模块/解决方案。

如果您只需要读取一些值,那么您可以在创建线程时传递它们。

最后,唯一的解决方案是如果您成功操纵 session 变量,则不要使用线程。

为什么这个设计?

为什么 MS session 不允许您在页面外和线程内处理它?答案是因为需要在页面处理时锁定 session 数据——有了这个锁,即使你启动一个线程并且能够获取 session 数据,也无法并行使用它。

另外如果你能够在一个线程中使用自己的 session ,那么这个线程可能会锁定整个页面查看过程,因为我再说一遍, session 是锁定整个页面查看,并且使用相同 session 的每个页面都不会并行工作

整个页面上的 session 锁定是 MS session 工作方式所必需的,避免这种情况的唯一方法是制作完全自定义的 session 解决方案,并使用不同的代码处理特殊情况。

该设计的好处是您避免在每次页面调用时自行进行大量锁定和同步 - 例如,如果您禁用页面上的 session ,并使用该页面插入数据,如果使用 make multiple double单击插入,并且您没有在插入上同步处理它,您最终会得到多个相同的插入。

有关 session 锁定的更多信息:
Replacing ASP.Net's session entirely
Web app blocked while processing another web app on sharing same session
jQuery Ajax calls to web service seem to be synchronous
ASP.NET Server does not process pages asynchronously

类似的问题:
How to get Session Data with out having HttpContext.Current, by SessionID

关于asp.net - 在从 PageAsyncTask 调用的方法中时,HttpContext.Current 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13843744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com