在下面的代码中更改会话变量(即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?
}
);
}
答案 0 :(得分:3)
这不是线程安全的,但可以安全地更改不同打开页面的会话。
因此,在某些情况下,如果你打电话是安全的。
如果您仅从您的网页中将其称为,则可以在不同的网页上安全使用。 原因是会话从页面加载开始到结束完全锁定会话。
一些类似的答案证明了这一点。
Web app blocked while processing another web app on sharing same session
Does ASP.NET Web Forms prevent a double click submission?
Trying to make Web Method Asynchronous
如果您从同一页多次调用,从不同的主题调用,则需要同步。