会话变量在ASP.Net页中的并行.For循环中是线程安全的吗
在下面的代码中更改会话变量(即会话[“进度”])是否安全 此代码是ASP.Net页面代码隐藏的一部分 当并行运行一个循环时,两个迭代可能同时运行,如果两个迭代都更改了相同的会话变量,则会导致问题会话变量在ASP.Net页中的并行.For循环中是线程安全的吗,asp.net,multithreading,c#-4.0,task-parallel-library,Asp.net,Multithreading,C# 4.0,Task Parallel Library,在下面的代码中更改会话变量(即会话[“进度”])是否安全 此代码是ASP.Net页面代码隐藏的一部分 当并行运行一个循环时,两个迭代可能同时运行,如果两个迭代都更改了相同的会话变量,则会导致问题 public void LongOperation() { Parallel.For(0, totalMembers,(i,loopState) => { Thread.Sleep(2000);//wait some time
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?
}
);
}
这不是线程安全的,但是跨不同打开页面的会话可以安全地更改 所以在某些情况下,如果你叫它是安全的 如果您在页面中只调用了一次,则在不同页面之间是安全的。 原因是会话从页面加载开始到结束都是完全锁定的 一些类似的答案证明了这一点
如果您从同一页面、不同线程多次调用它,那么您需要同步 笔记
- 如果此循环需要很长时间才能完成,则所有用户都将等待 这不仅是会话用户的计算。所有用户都将被会话锁锁定。如果有太多的用户打电话,那么所有的用户将一起等待很长时间。因此,您可能需要对调度程序任务进行此计算
- 如果处理循环内部数据的时间小于创建和同步线程所需的时间,则并行循环比简单循环需要更多的时间来完成。所以你需要计算简单循环和并行循环的速度