Using Stack Collection in ASP.NET Website



我需要在我的asp.net项目中使用在类中创建的堆栈集合

public class ExpressionsEvaluator
{
    public Stack<ExpressionParameter> expressionParameters = new Stack<ExpressionParameter>();
    public object EvaluateExpression()
    {
        // calculate expression patamers
        expressionParameters.Push(parameter);
        // Do some functions
        // remove the last parameters
        expressionParameters.Pop();
    }
}

这种方法线程安全吗?

每个访问网站的用户的expressionParameters对象会有所不同吗?

用例:

    public ActionResult EvaluateExpression(string expression)
    {
        try
        {
            ExpressionsEvaluator expressionEvaluator = new ExpressionsEvaluator();
            object result = expressionEvaluator.EvaluateExpression(expression);
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            return Json(new { hasError = true }, JsonRequestBehavior.AllowGet);
        }
    }

这种方法线程安全吗?

是的,类本身是线程安全的。这就是你如何使用它。

每个用户的expressionParameters对象是否不同访问网站?

这取决于你如何使用它,以及你将它存储在哪里。如果你在网页中创建一个它的实例,那么它将是每个页面请求的一个全新实例。如果您创建了一个实例,但将其存储在某个位置,则这取决于存储的工作方式。如果使用会话,则每个用户都有自己的实例。

好吧,我想您正在使用。NET Framework 4.0。

。NET 4.0 Framework在系统中引入了线程安全集合。集合。并发命名空间:请看这里和这里

并发包表示线程安全、无序的对象集合。

并发字典表示多个线程可以同时访问的键值对的线程安全集合。

并发队列表示线程安全先进先出(FIFO)集合。

并发堆栈表示线程安全的后进先出(LIFO)集合。

中的其他集合。NET Framework默认情况下不是线程安全的,需要为每个操作锁定:

lock (mySetNeedToBeLock)
{
    mySetNeedToBeLock.Add("my information in set");
}

这完全取决于实际使用ExpressionsEvaluator的方式。

目前,代码根本没有使用任何线程安全性,因此消费者将不得不使用,例如通过锁定对共享ExpressionsEvaluator实例的访问。

至于您的第二个问题,您可能想了解ASP中的会话管理。NET

最新更新