在下面的代码中更改会话变量(即 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?
}
);
}
这不是线程安全的, but 跨不同打开页面的会话可以安全地更改.
所以在某些情况下如果你调用它是安全的。
如果你称它为仅从您的页面出现过一次,那么跨不同页面是安全的。
原因是会话从页面加载开始到结束完全锁定会话。
一些类似的答案可以证明这一点。
处理共享同一会话的另一个 Web 应用程序时 Web 应用程序被阻止
ASP.NET Web 表单是否阻止双击提交?
尝试使 Web 方法异步
如果您多次调用它来自同一页面, from 不同的线程, 然后你需要同步.
Notes
- 如果这个循环需要很长时间才能完成那么所有用户都将等待
那个计算不仅仅是会话用户。所有用户都将被会话锁锁定。如果太多用户呼叫,那么所有用户都会等待很长时间。因此,您可能需要在调度程序任务上进行此计算。
- If 循环内处理数据的时间小于循环创建和同步线程所需的时间,那么并行循环比简单循环需要更多的时间来完成。因此,您需要在这里计算简单循环和并行循环的速度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)