【发布时间】:2014-07-28 03:03:11
【问题描述】:
在下面的代码中更改会话变量(即 Session["Progress"])是否安全?
此代码是 ASP.Net 页面代码隐藏的一部分。
并行运行循环时,两个迭代可能同时运行,如果两个迭代都更改了同一个会话变量,则会导致问题。
public void LongOperation()
{
Parallel.For(0, totalMembers,(i,loopState) =>
{
Thread.Sleep(2000);//wait some time to simulate processing
progress++;
Session["Progress"] = progress;//IS THIS THREAD-SAFE?
}
);
}
【问题讨论】:
-
文档指出实例方法不是线程安全的。你为什么要做并行工作,你有没有想过它将如何消耗用于 asp.net 请求的线程? msdn.microsoft.com/en-us/library/…
-
为了确保它是你总是可以实现一些锁定
-
@SimonSvensson,看看这个会话状态似乎是线程安全的:stackoverflow.com/questions/2715532/…
-
@SimonSvensson,在 ASP.Net 中是否不建议使用并行循环?我想,并行性会根据可用的 CPU、内存和线程自动优化自身,因此我可以毫无风险地使用它。
-
@Sunil,会话状态在“任何时候只有一个 http 请求写入会话”的上下文中是线程安全的。如果您启动自己的线程访问它,则没有线程安全性。并行的东西通常使用 ThreadPool 进行调度,与 asp.net 请求使用的线程相同,从而减少了可用于传入 http 请求的线程。你能告诉我们更多为什么你觉得需要并行的东西吗?你想解决什么问题?
标签: asp.net multithreading c#-4.0 task-parallel-library