2012-08-22 89 views
0

我需要在我的asp.net项目使用类在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); 
     } 
    } 

回答

1

是这种方法的线程安全吗?

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

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

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

0

好吧,我假设你正在使用的.NET Framework 4.0。

的.NET 4.0框架引入了System.Collections.Concurrent命名空间线程安全的集合: 请参阅herehere

ConcurrentBag 表示对象的线程安全的,无序的集合。

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

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

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

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

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

是的,我使用.NET 4.0。我不需要允许多个用户编辑同一个列表,我只需要确保他们将得到他们自己的列表进行编辑,并且不会影响其他列表(但我认为这是默认行为,对不对?) – Catalin

+0

使用新的并发集合传达了从多个线程访问实例的情况,这是误导性的,因为这不是OP正在做的事情。我的建议是:不要将并发集合用于不需要线程安全的代码。 – Steven

0

这完全取决于你打算如何实际使用ExpressionsEvaluator。现在,代码根本没有使用任何线程安全性,因此消费者将不得不通过locking访问共享的实例。

关于你的第二个问题,你可能要阅读有关session management in ASP.NET