ASP.Net Web应用程序:如何将Session传递给新线程

本文关键字:新线程 线程 Session 应用程序 Web Net ASP | 更新日期: 2023-09-27 17:54:49

我有一个web应用程序,它根据用户的输入,计算出符合要求的产品组合,并为用户返回报价。这个计算可能需要一些时间,所以我向用户显示一个进度对话框。

进度对话框是一个带有UpdatePanel的UserControl,它包含一些文本标签,一个按钮和一个用于AsynchPostBackTrigger触发器的计时器。这是在我的aspx页面上声明的,但默认情况下是隐藏的。

之前,我创建了一个单独的线程来完成繁重的工作,同时使用主线程更新进度对话框。没有任何问题。这里是我开始线程的地方:

    protected void StartQuoteCalculation(object sender, EventArgs e)
    {
        TotalPanelCount = CurrentQuote.PanelCount;
        ProgressDialog.ShowPopup();
        CalculateQuoteThread = new Thread(new ThreadStart(CalculateQuote));
        CalculateQuoteThread.Start();
    }

其中CalculateQuote做了大量的工作。

然而,我最近不得不改变一些与此完全无关的东西,但它现在正在影响组合的计算。

在报价计算期间使用的变量现在存储在用户会话中。当我们启动上面的工作线程时,会话丢失,所以当访问这个变量时,它会抛出一个NullReference异常。为了解决这个问题,我尝试过传递HttpContext。当前到新线程,如下所示:

protected void StartQuoteCalculation(object sender, EventArgs e)
{
        TotalPanelCount = CurrentQuote.PanelCount;
        ProgressDialog.ShowPopup();
         HttpContext ctx = HttpContext.Current;
         CalculateQuoteThread = new Thread(new ThreadStart(() =>
             {
                 HttpContext.Current = ctx;
                 CalculateQuote();
             }));
         CalculateQuoteThread.Start();
}

然而,会话似乎在短时间内保持有效,但几秒钟后它仍然抛出NullReferenceException。HttpContext。Current是有效的,但是HttpContext.Current.Session是空的。

所以,我有几个问题:

    如果可以将HttpContext传递给另一个线程,为什么呢会话在短时间后变为空?我该如何预防呢?是否可以在新线程中创建,显示和更新ProgressDialog面板?(保持产品计算在主线程中使用有效的Session数据)

我在第2条上尝试了几件事,但由于我对asp.net和web开发一般不太了解,我没有成功。

ASP.Net Web应用程序:如何将Session传递给新线程

我将存储包含该计算状态的整个对象,而不是在会话中存储单个变量。这样,当网站轮询状态更新时,应用程序可以通过从会话中检索该对象来检索当前状态。它将是"正在进行中"、"完成"(输出)或异常(从未发生过!)

如果您希望用户能够运行多个进程,那么您可以存储Dictionary<guid, YourProcess>,然后客户端可以接收guid并使用它来请求状态。

这样,客户端有一个对象的引用,正在执行该进程,但执行该进程的线程不需要引用SessionHttpContext。它只需要知道它正在操作的类的哪个实例,然后用进度或最终结果更新它。