在从PageAsyncTask调用的方法中,HttpContext.Current为null

时间:2012-12-12 16:04:43

标签: asp.net session asynchronous

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

   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;                  
            }
        }
}

1 个答案:

答案 0 :(得分:3)

答案很简单:如果HttpContext.Current is null

,则无法使用会话

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

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

最后唯一的解决方案是,如果你想操纵会话变量,就不要使用该线程。

为什么会这样设计?

为什么MS会话不允许你在页面的一侧和线程内处理它?答案是因为需要在页面处理时锁定会话数据 - 即使你启动一个线程并且能够获得会话数据,这个锁也无法并行使用它。

此外,如果你能够在一个线程中使用你自己的会话,那么这个线程可能会锁定整个页面查看过程,因为我再说一遍,session会锁定整个页面视图,以及每个使用它的页面会话不能并行工作

整个页面上的会话锁定对于MS会话的工作方式是必要的,避免这种情况的唯一方法是制作完全自定义的会话解决方案,并处理具有不同代码的特殊情况。

关于该设计的好处在于,您可以避免在每次页面调用时通过自己进行大量锁定和同步 - 例如,如果您在页面上禁用会话,并使用该页面进行数据插入,如果使用在插入上多次双击,并且在插入时不进行同步处理,最终会有多次相同的插入。

有关会话锁定的更多信息:
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