我需要在我的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