0

我需要在我的 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);
        }
    }
4

3 回答 3

1

这种方法线程安全吗?

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

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

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

于 2012-08-22T08:07:46.673 回答
0

好吧,我假设您使用的是 .NET Framework 4.0。

.NET 4.0 框架在 System.Collections.Concurrent 命名空间中引入了线程安全集合:请参见此处此处

ConcurrentBag 表示一个线程安全的、无序的对象集合。

ConcurrentDictionary 表示可由多个线程同时访问的键值对的线程安全集合。

ConcurrentQueue 表示线程安全的先进先出 (FIFO) 集合。

ConcurrentStack 表示线程安全的后进先出 (LIFO) 集合。

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

lock (mySetNeedToBeLock)
{
    mySetNeedToBeLock.Add("my information in set");
}
于 2012-08-22T07:58:44.303 回答
0

这完全取决于您将如何实际使用ExpressionsEvaluator.

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

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

于 2012-08-22T08:03:52.460 回答